Fecha actual Vie Mar 29, 2024 2:56 am

Todos los horarios son UTC + 1 hora [ DST ]




Nuevo tema Responder al tema  [ 7 mensajes ] 
Autor Mensaje
 Asunto: SQLITE
NotaPublicado: Jue Ago 26, 2021 10:08 am 
Avatar de Usuario

Registrado: Dom Oct 09, 2005 11:26 am
Mensajes: 362
Ubicación: Salamanca - España
Hola, gente.
Quiero compartir las funciones que uso para el manejo de SQLITE.
Voy a empezar con con las dos más básicas.

// ---

// ============================================================================
// int FUNCTION SQLite3_Open( cFileName, nFlags, iTimeOut, hDB )
// 2019.11.15 17:31 Creación
// 2021.08.25 21:38 Revisión
// Si no existe la DB, se crea
// ============================================================================
FUNCTION SQLite3_Open( cFileName, nFlags, iTimeOut, hDB )

LOCAL cMsg AS String
LOCAL iErrorCode AS Integer

IF ( ValType( nFlags ) != 'N' )
nFlags := SQLITE_OPEN_READWRITE + SQLITE_OPEN_CREATE
ENDIF

// Valor por defecto de <iTimeOut>
IF !( ValType( iTimeOut ) == 'N' )
iTimeOut := 5000
ENDIF

iErrorCode := sqlite3_open_v2( ToUTF8( cFileName ), @hDB, nFlags )
IF ( iErrorCode == SQLITE_OK )
IF iTimeOut > 0
sqlite3_Execute_Query( hDB, "PRAGMA busy_timeout = " + IntToStr( iTimeOut ) )
ENDIF
ELSE
IF Assigned( hDB )
cMsg := sqlite3_ErrMsg( hDB )
MessageDlg( "*** NO SE PUEDE ABRIR LA BASE DE DATOS ***" + CRLF + CRLF +;
"Error: " + IntToStr( iErrorCode ) + CRLF +;
cFileName + CRLF +;
cMsg + msg_CopyRight, mtError, mbOk, poActiveCenter )
sqlite3_Close_V2( hDB )
hDB := NIL
ELSE
MessageDlg( "*** NO SE PUEDE ABRIR LA BASE DE DATOS ***" + CRLF + CRLF +;
cFileName + CRLF +;
"Error desconocido" + msg_CopyRight,;
mtError, mbOk, poScreenCenter )
ENDIF
ENDIF

RETURN iErrorCode

// ============================================================================
// PROCEDURE SQLite3_Close( hDB )
// int sqlite3_close_v2(sqlite3*);
// 2019.11.15 17:40 Creación
// 2021.07.01 10:46 Revision
// ============================================================================
PROCEDURE SQLite3_Close( hDB )
IF Assigned( hDB )
sqlite3_close_v2( hDB )
hDB := NIL
ENDIF
RETURN
// ---

La función SQLite3_Close( hDB ) tiene que llamarse de éste modo

SQLite3_Close( @hDB )

_________________
Un saludo.
Jesús P. Melgar Velasco


Arriba
 Perfil  
Responder citando  
 Asunto: Re: SQLITE
NotaPublicado: Lun Ago 30, 2021 10:05 am 
Avatar de Usuario

Registrado: Mar Dic 27, 2005 2:58 pm
Mensajes: 76
Muchas gracias, yo uso intensivamente SQLite en mis programas y también tengo alguna función de ese tipo para abrir, cerrar y ejecutar consultas,


Arriba
 Perfil  
Responder citando  
 Asunto: Re: SQLITE
NotaPublicado: Mar Ago 31, 2021 12:06 pm 
Avatar de Usuario

Registrado: Dom Oct 09, 2005 11:26 am
Mensajes: 362
Ubicación: Salamanca - España
AlbertoGarcia escribió:
Muchas gracias, yo uso intensivamente SQLite en mis programas y también tengo alguna función de ese tipo para abrir, cerrar y ejecutar consultas,

Hola, Alberto.
No tengo solo eso, tiene más cosas, pero quería ver si había interes por aquí.
Mira acabo de incorporar esta para saber si el archivo de sqlite es válido.

// ============================================================================
// bool function SQLite_ValidFile( cFileName )
// 2021.08.30 22:13 Creacion
// Comprobar si el archivo es una base de datos SQLite válida
// ============================================================================
function SQLite_ValidFile( cFileName )

local nHandle, cBuffer as Handle

cBuffer := Space( 15 )
if File( cFileName )
nHandle := fopen( cFileName, FO_READ )
FSeek( nHandle, 0, FS_SET )
FRead( nHandle, @cBuffer, 15 )
FClose( nHandle )
endif

RETURN ( "SQLite format 3" == cBuffer )

Te iré pasando más...

_________________
Un saludo.
Jesús P. Melgar Velasco


Arriba
 Perfil  
Responder citando  
 Asunto: Re: SQLITE
NotaPublicado: Mar Ago 31, 2021 12:09 pm 
Avatar de Usuario

Registrado: Dom Oct 09, 2005 11:26 am
Mensajes: 362
Ubicación: Salamanca - España
La que más se utiliza es esta:

// ============================================================================
// function SQLite3_Exec( hDB, cQuery, aResult, nError, aColsName, lMsg )
// 2019.11.15 13:41 Creacion
// Parámetros:
// hDb Handle DB
// cQuery SQL a evaluar
// aResult Array. Lista de datos
// iReturnCode Código de error devuelto
// cColsName Array con el nombre de las columnas
// ============================================================================
function SQLite3_Exec( hDB, cQuery, aResult, aColsName )

LOCAL cBuffer AS String

if IsArray( aResult )
m_iLastError := sqlite3_Execute_Query( hDB, cQuery, @cBuffer )
if ( m_iLastError == SQLITE_OK )
sqlite3_expand_query( cBuffer, @m_iLastError, @aColsName, @aResult )
endif
else
m_iLastError := sqlite3_Execute_Query( hDB, cQuery )
endif

SQLite3_Check( hDB, cQuery )

return ( m_iLastError == SQLITE_OK )

m_iLastError es un estática a la que se accede con:

STATIC m_iLastError

// ============================================================================
// int function SQLite3_GetLastError()
// 2021.08.27 12:58 Creacion
// ============================================================================
function SQLite3_GetLastError()
return m_iLastError

// ============================================================================
// PROCEDURE SQLite3_ClearError()
// 2021.08.27 12:58 Creacion
// ============================================================================
PROCEDURE SQLite3_ClearError()
m_iLastError := SQLITE_OK
RETURN

_________________
Un saludo.
Jesús P. Melgar Velasco


Arriba
 Perfil  
Responder citando  
 Asunto: Re: SQLITE
NotaPublicado: Mar Ago 31, 2021 12:12 pm 
Avatar de Usuario

Registrado: Dom Oct 09, 2005 11:26 am
Mensajes: 362
Ubicación: Salamanca - España
Estaban mal los cometarios de la función. Solucionado

// ============================================================================
// unction SQLite3_Exec( hDB, cQuery, aResult, aColsName )
// 2019.11.15 13:41 Creacion
// 2021.08.31 12:11 Revisión
// Parámetros:
// hDb Handle DB
// cQuery SQL a evaluar
// aResult Array. Lista de datos
// cColsName Array con el nombre de las columnas
// ============================================================================
function SQLite3_Exec( hDB, cQuery, aResult, aColsName )

LOCAL cBuffer AS String

if IsArray( aResult )
m_iLastError := sqlite3_Execute_Query( hDB, cQuery, @cBuffer )
if ( m_iLastError == SQLITE_OK )
sqlite3_expand_query( cBuffer, @m_iLastError, @aColsName, @aResult )
endif
else
m_iLastError := sqlite3_Execute_Query( hDB, cQuery )
endif

SQLite3_Check( hDB, cQuery )

return ( m_iLastError == SQLITE_OK )

_________________
Un saludo.
Jesús P. Melgar Velasco


Arriba
 Perfil  
Responder citando  
 Asunto: Re: SQLITE
NotaPublicado: Mar Ago 31, 2021 12:34 pm 
Avatar de Usuario

Registrado: Dom Oct 09, 2005 11:26 am
Mensajes: 362
Ubicación: Salamanca - España
Te pongo, de nuevo las funciones de OPEN y CLOSE que las he modificado.

// ============================================================================
// bool function SQLite3_Open( cFileName, nFlags, iTimeOut, hDB )
// 2019.11.15 17:31 Creación
// 2021.08.25 21:38 Revisión
// Si no existe la DB, se crea
// ============================================================================
function SQLite3_Open( cFileName, nFlags, iTimeOut, hDB )

if ( ValType( nFlags ) != 'N' )
nFlags := SQLITE_OPEN_READWRITE + SQLITE_OPEN_CREATE
endif

// Valor por defecto de <iTimeOut>
if !( ValType( iTimeOut ) == 'N' )
iTimeOut := 5000
endif

m_iLastError := sqlite3_open_v2( ToUTF8( cFileName ), @hDB, nFlags )
if ( m_iLastError == SQLITE_OK )
if iTimeOut > 0
sqlite3_Execute_Query( hDB,;
"PRAGMA busy_timeout = " + IntToStr( iTimeOut ) )
endif
else
SQLite3_Exception( hDB )
if Assigned( hDB )
SQLite3_Exception( hDB )
SQLite3_Close( @hDB )
else
SQLite3_Exception( "NO SE PUEDE ABRIR LA BASE DE DATOS" + CRLF + cFileName )
endif
endif

return ( m_iLastError == SQLITE_OK )

// ============================================================================
// int function SQLite3_Close( hDB )
// 2019.11.15 17:40 Creación
// 2021.07.01 10:46 Revision
// 2021.08.26 10:57 Revision
// ============================================================================
function SQLite3_Close( hDB )

m_iLastError := sqlite3_close_v2( hDB )

if ( m_iLastError == SQLITE_OK )
hDB := NIL
endif

return ( m_iLastError == SQLITE_OK )

_________________
Un saludo.
Jesús P. Melgar Velasco


Arriba
 Perfil  
Responder citando  
 Asunto: Re: SQLITE
NotaPublicado: Mié Sep 22, 2021 1:09 pm 

Registrado: Jue Nov 03, 2005 7:20 pm
Mensajes: 132
Ubicación: Teruel(España)
Buenos días
Lo veo interesante y me va a ayudar a la migración, es curioso pero en entorno de red, multiusuario y windows 10 pierde velociddad, els mismo programa que con 95 y xp volaba

Muchas gracias por la aportacion


Arriba
 Perfil  
Responder citando  
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 7 mensajes ] 

Todos los horarios son UTC + 1 hora [ DST ]


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

Buscar:
Saltar a:  
cron