fastpho
28 de abril de 2023, 13:22
Permite integrar el motor de base de datos de SQlite con nuestras aplicaciones.
En mi caso es para poder interactuar con una aplicacion que hice para Android
y poder leer la informacion de la BD y evitar utilizar archivos con formato .CSV
como interface.
Su implementacion es muy sencilla descargar Binarios precompilados
para Windows para su version 32 bits (sqlite3.dll) no hace falta registrarla.
1 - Copiar Sqlite3.dll en la carpeta del proyecto
2 - Agregar la funciones de la libreria en el Archivo COBOL85
3 - Luego llamar a esas funciones via call
4 - Informacion de las funciones en : https://sqlite.org/c3ref/funclist.html
Ejemplo para abrir , crear , insertar , actualizar un registro y cerrar
Declaracion Variables
01 BD-HANDLE PIC 9(9) COMP-5 IS GLOBAL. *>Handle de la BD
01 BD-FILE-NAME PIC X(50) IS GLOBAL. *>Nombre de la BD
01 BD-SQL-QUERY PIC X(256) IS GLOBAL. *>string sql (Create , Insert , Delete , Update , Select)
01 BD-SQL-STRING-LENGHT PIC S9(9) COMP-5 IS GLOBAL.
01 BD-HANDLE-STMT PIC 9(9) COMP-5 IS GLOBAL. *>Puntero Statement
01 BD-STMT-PTR REDEFINES BD-HANDLE-STMT POINTER IS GLOBAL. *>Redefines del Puntero Statement
01 BD-INT-POINTER POINTER IS GLOBAL.
01 BD-INT PIC 9(9) COMP-5 IS GLOBAL. *> INTEGER
01 BD-DOB PIC 9(9) COMP-5 IS GLOBAL. *> DOUBLE
01 BD-TEXT-POINTER POINTER IS GLOBAL.
01 BD-TEXT PIC X(256) IS GLOBAL. *> TEXT
01 BD-SQL-ERROR POINTER IS GLOBAL.
01 BD-FILA-ID PIC 9(9) COMP-5 IS GLOBAL.
01 BD-COLUMNA-CANTIDAD PIC 9(9) COMP-5 IS GLOBAL.
01 BD-COLUMNA-NUMERO PIC 9(9) COMP-5 IS GLOBAL.
01 BD-COLUMNA-NOMBRE PIC X(256) IS GLOBAL.
01 BD-COLUMNA-POINTER POINTER IS GLOBAL.
* Estado de la Base de Datos
01 BD-STATUS PIC 9(9) COMP-5 IS GLOBAL.
*>Estado de la BD
01 ESTADOS-BD IS GLOBAL.
03 SQLITE_OK PIC 9(9) COMP-5 VALUE 0. *> /* Successful result */
03 SQLITE_ERROR PIC 9(9) COMP-5 VALUE 1. *> /* Generic error */
03 SQLITE_BUSY PIC 9(9) COMP-5 VALUE 5. *> /* The database file is locked */
03 SQLITE_LOCKED PIC 9(9) COMP-5 VALUE 6. *> /* A table in the database is locked */
03 SQLITE_READONLY PIC 9(9) COMP-5 VALUE 8. *> /* Attempt to write a readonly database */
03 SQLITE_EMPTY PIC 9(9) COMP-5 VALUE 16. *> /* Attempt to write a readonly database */
03 SQLITE_MISUSE PIC 9(9) COMP-5 VALUE 21. *> /* Library used incorrectly */
03 SQLITE_WARNING PIC 9(9) COMP-5 VALUE 28. *> /* unusual and possibly ill-advised operation is taking place.*/
03 SQLITE-ROW PIC 9(9) COMP-5 VALUE 100. *> /* sqlite3_step() has another row ready */
03 SQLITE-DONE PIC 9(9) COMP-5 VALUE 101. *> /* sqlite3_step() has finished executing */
* Tipos de Datos sqlite
01 BD-COLUMNA-TIPO PIC 9(4) COMP-5 IS GLOBAL.
88 SQL-INTEGER VALUE 1. *>
88 SQL-REAL VALUE 2. *>
88 SQL-TEXT VALUE 3. *>
88 SQL-BLOB VALUE 4. *>
88 SQL-NULL VALUE 5. *>
01 FECHA-CONVERTIR PIC 9(8) IS GLOBAL. *> AAAAMMDD a Convertir
01 FECHA-CONVERTIDA-UNIX PIC 9(13) IS GLOBAL. *> Fecha con formato unix
01 FECHA-UNIX1970 PIC S9(9) COMP-5 IS GLOBAL. *> desde AAAAMMDDD 19700101
01 FECHA-INT PIC S9(9) COMP-5 IS GLOBAL.
01 FECHA-AMD PIC 9(8) IS GLOBAL.
01 FECHA-AMD-ED PIC XXXX/XX/XX IS GLOBAL.
01 NULO PIC 9(9) COMP-5 VALUE 0 IS GLOBAL. *> NULO
*>https://sqlite.org/cintro.html
*>Funciones de la libreria sqlit3.dll
*>https://sqlite.org/c3ref/funclist.html
*>Funciones Declaradas en el archivo COBOL85.CBR
*>Fecha 17-04-2023
01 FUNCIONES-SQLITE3-LIB PIC X(50) IS GLOBAL.
*> sqlite3-connection functions
*> sqlite3_libversion (OUT <text>) *> Devuelve la versión de sqlite a través del parámetro OUT. OK probado
*> sqlite3_libversion_number (OUT <int> ) *> Devuelve el número de versión como un int OK probado
*> sqlite3_open (<nombre de archivo>, OUT <controlador de la base de datos>). *> Esto abre un archivo de base de datos SQLite , nueva o existente como se especifica en el argumento de nombre de archivo.OK probado
*> sqlite3_close (<db-handle>)(<identificador de la base de datos>) *> Destructor de la interface , cierra la BD OK probado
*> sqlite3_exec (<gestor-bd>,<cadena-sql>) *> Es una envoltura sqlite3_prepare_v2(), sqlite3_step() y sqlite3_finalize() OK probado
*> sqlite3_errmsg (<db-handle>, OUT <mensaje de error) *> Devuelve texto en inglés como un parámetro OUT que describe el último error en la conexión. OK probado
*> sqlit3-statement functions
*> sqlite3_prepare_v2 *>Constructor OK probado
*> sqlite3_finalize *>Destructor OK probado
*> Pass
*> sqlite3_step int sqlite3_step(sqlite3_stmt*); OK probado
*> sqlite3_reset int sqlite3_reset(sqlite3_stmt *pStmt); OK probado
*> sqlite3_finalize int sqlite3_finalize(sqlite3_stmt *pStmt); OK probado
*> Statement column access (0-base indices)
*> sqlite3_column_count int sqlite3_column_count(sqlite3_stmt *pStmt); OK probado
*> sqlite3_column_type int sqlite3_column_type(sqlite3_stmt*, int iCol); OK probado
*> sqlite3_column_name const char *sqlite3_column_name(sqlite3_stmt*, int N); OK probado
*> Statement column type
*> sqlite3_column_int int sqlite3_column_int(sqlite3_stmt*, int iCol); OK probado
*> sqlite3_column_text const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); OK probado
*> sqlite3_column_double double sqlite3_column_double(sqlite3_stmt*, int iCol); OK probado
*> sqlite3_column_blob no implementado
Abrir BD
*------------------------------------------------------------------
*>sqlite3_open
* DISPLAY "------------".
* DISPLAY "sqlite3_open".
MOVE SPACES TO FUNCIONES-SQLITE3-LIB.
MOVE "sqlite3_open" TO FUNCIONES-SQLITE3-LIB.
MOVE "datos.db" & X"00" TO BD-FILE-NAME.
call FUNCIONES-SQLITE3-LIB WITH STDCALL LINKAGE
USING BY REFERENCE BD-FILE-NAME
BY REFERENCE BD-HANDLE
returning BD-STATUS
end-call.
IF BD-STATUS NOT = SQLITE_OK THEN
CALL "BD-ERROR"
ELSE
MOVE "OK" TO "Caption" OF CmStatic2
END-IF.
Crear BD
*------------------------------------------------------------------
*>sqlite3_exec
* DISPLAY "------------".
* DISPLAY "sqlite3_exec".
* DISPLAY "CREATE".
MOVE SPACES TO BD-SQL-QUERY.
MOVE SPACES TO FUNCIONES-SQLITE3-LIB.
MOVE "sqlite3_exec" TO FUNCIONES-SQLITE3-LIB.
MOVE "CREATE TABLE usuarios (id INTEGER PRIMARY KEY AUTOINCREMENT , nombre TEXT , edad INTEGER )" & X"00" TO BD-SQL-QUERY.
call FUNCIONES-SQLITE3-LIB WITH STDCALL LINKAGE
USING
BY VALUE BD-HANDLE
BY CONTENT BD-SQL-QUERY
BY VALUE 0
BY VALUE 0
BY VALUE 0
returning BD-STATUS
end-call.
IF BD-STATUS NOT = SQLITE_OK THEN
CALL "BD-ERROR"
ELSE
MOVE "OK" TO "Caption" OF CmStatic2
END-IF.
Insertar Registro BD
*------------------------------------------------------------------
*>sqlite3_exec
* DISPLAY "------------------".
* DISPLAY "sqlite3_exec".
* DISPLAY "INSERT".
MOVE SPACES TO FUNCIONES-SQLITE3-LIB.
MOVE "sqlite3_exec" TO FUNCIONES-SQLITE3-LIB.
MOVE SPACES TO BD-SQL-QUERY.
string "INSERT INTO usuarios (nombre , edad ) " delimited by size
" VALUES ('Leonardo' , 24 )" delimited by size
x"00" delimited by size
into BD-SQL-QUERY
end-string.
call FUNCIONES-SQLITE3-LIB WITH STDCALL LINKAGE
USING
BY VALUE BD-HANDLE
BY CONTENT BD-SQL-QUERY
BY VALUE 0
BY VALUE 0
BY VALUE 0
returning BD-STATUS
end-call.
IF BD-STATUS NOT = SQLITE_OK
CALL "BD-ERROR"
END-IF.
Actualizar Registro BD
PROCEDURE DIVISION.
*------------------------------------------------------------------
*>sqlite3_exec
* DISPLAY "------------------".
* DISPLAY "sqlite3_exec".
* DISPLAY "UPDATE".
MOVE SPACES TO FUNCIONES-SQLITE3-LIB.
MOVE SPACES TO BD-SQL-QUERY.
MOVE "sqlite3_exec" TO FUNCIONES-SQLITE3-LIB.
string "UPDATE usuarios SET nombre = 'xxxx' " delimited by size
" WHERE id = 1" delimited by size
x"00" delimited by size
into BD-SQL-QUERY
end-string.
call FUNCIONES-SQLITE3-LIB WITH STDCALL LINKAGE
USING
BY VALUE BD-HANDLE
BY CONTENT BD-SQL-QUERY
BY VALUE 0
BY VALUE 0
BY VALUE 0
returning BD-STATUS
end-call.
IF BD-STATUS NOT = SQLITE_OK
CALL "BD-ERROR"
ELSE
MOVE "OK" TO "Caption" OF CmStatic2
END-IF.
Cerar BD
*------------------------------------------------------------------
*>sqlite3_close
* DISPLAY "------------".
* DISPLAY "sqlite3_close".
MOVE SPACES TO FUNCIONES-SQLITE3-LIB.
MOVE "sqlite3_close" TO FUNCIONES-SQLITE3-LIB.
call FUNCIONES-SQLITE3-LIB WITH STDCALL LINKAGE
USING BY VALUE BD-HANDLE
returning BD-STATUS
end-call.
IF BD-STATUS NOT = SQLITE_OK THEN
CALL "BD-ERROR"
ELSE
MOVE "OK" TO "Caption" OF CmStatic2
END-IF.
Saludos....
En mi caso es para poder interactuar con una aplicacion que hice para Android
y poder leer la informacion de la BD y evitar utilizar archivos con formato .CSV
como interface.
Su implementacion es muy sencilla descargar Binarios precompilados
para Windows para su version 32 bits (sqlite3.dll) no hace falta registrarla.
1 - Copiar Sqlite3.dll en la carpeta del proyecto
2 - Agregar la funciones de la libreria en el Archivo COBOL85
3 - Luego llamar a esas funciones via call
4 - Informacion de las funciones en : https://sqlite.org/c3ref/funclist.html
Ejemplo para abrir , crear , insertar , actualizar un registro y cerrar
Declaracion Variables
01 BD-HANDLE PIC 9(9) COMP-5 IS GLOBAL. *>Handle de la BD
01 BD-FILE-NAME PIC X(50) IS GLOBAL. *>Nombre de la BD
01 BD-SQL-QUERY PIC X(256) IS GLOBAL. *>string sql (Create , Insert , Delete , Update , Select)
01 BD-SQL-STRING-LENGHT PIC S9(9) COMP-5 IS GLOBAL.
01 BD-HANDLE-STMT PIC 9(9) COMP-5 IS GLOBAL. *>Puntero Statement
01 BD-STMT-PTR REDEFINES BD-HANDLE-STMT POINTER IS GLOBAL. *>Redefines del Puntero Statement
01 BD-INT-POINTER POINTER IS GLOBAL.
01 BD-INT PIC 9(9) COMP-5 IS GLOBAL. *> INTEGER
01 BD-DOB PIC 9(9) COMP-5 IS GLOBAL. *> DOUBLE
01 BD-TEXT-POINTER POINTER IS GLOBAL.
01 BD-TEXT PIC X(256) IS GLOBAL. *> TEXT
01 BD-SQL-ERROR POINTER IS GLOBAL.
01 BD-FILA-ID PIC 9(9) COMP-5 IS GLOBAL.
01 BD-COLUMNA-CANTIDAD PIC 9(9) COMP-5 IS GLOBAL.
01 BD-COLUMNA-NUMERO PIC 9(9) COMP-5 IS GLOBAL.
01 BD-COLUMNA-NOMBRE PIC X(256) IS GLOBAL.
01 BD-COLUMNA-POINTER POINTER IS GLOBAL.
* Estado de la Base de Datos
01 BD-STATUS PIC 9(9) COMP-5 IS GLOBAL.
*>Estado de la BD
01 ESTADOS-BD IS GLOBAL.
03 SQLITE_OK PIC 9(9) COMP-5 VALUE 0. *> /* Successful result */
03 SQLITE_ERROR PIC 9(9) COMP-5 VALUE 1. *> /* Generic error */
03 SQLITE_BUSY PIC 9(9) COMP-5 VALUE 5. *> /* The database file is locked */
03 SQLITE_LOCKED PIC 9(9) COMP-5 VALUE 6. *> /* A table in the database is locked */
03 SQLITE_READONLY PIC 9(9) COMP-5 VALUE 8. *> /* Attempt to write a readonly database */
03 SQLITE_EMPTY PIC 9(9) COMP-5 VALUE 16. *> /* Attempt to write a readonly database */
03 SQLITE_MISUSE PIC 9(9) COMP-5 VALUE 21. *> /* Library used incorrectly */
03 SQLITE_WARNING PIC 9(9) COMP-5 VALUE 28. *> /* unusual and possibly ill-advised operation is taking place.*/
03 SQLITE-ROW PIC 9(9) COMP-5 VALUE 100. *> /* sqlite3_step() has another row ready */
03 SQLITE-DONE PIC 9(9) COMP-5 VALUE 101. *> /* sqlite3_step() has finished executing */
* Tipos de Datos sqlite
01 BD-COLUMNA-TIPO PIC 9(4) COMP-5 IS GLOBAL.
88 SQL-INTEGER VALUE 1. *>
88 SQL-REAL VALUE 2. *>
88 SQL-TEXT VALUE 3. *>
88 SQL-BLOB VALUE 4. *>
88 SQL-NULL VALUE 5. *>
01 FECHA-CONVERTIR PIC 9(8) IS GLOBAL. *> AAAAMMDD a Convertir
01 FECHA-CONVERTIDA-UNIX PIC 9(13) IS GLOBAL. *> Fecha con formato unix
01 FECHA-UNIX1970 PIC S9(9) COMP-5 IS GLOBAL. *> desde AAAAMMDDD 19700101
01 FECHA-INT PIC S9(9) COMP-5 IS GLOBAL.
01 FECHA-AMD PIC 9(8) IS GLOBAL.
01 FECHA-AMD-ED PIC XXXX/XX/XX IS GLOBAL.
01 NULO PIC 9(9) COMP-5 VALUE 0 IS GLOBAL. *> NULO
*>https://sqlite.org/cintro.html
*>Funciones de la libreria sqlit3.dll
*>https://sqlite.org/c3ref/funclist.html
*>Funciones Declaradas en el archivo COBOL85.CBR
*>Fecha 17-04-2023
01 FUNCIONES-SQLITE3-LIB PIC X(50) IS GLOBAL.
*> sqlite3-connection functions
*> sqlite3_libversion (OUT <text>) *> Devuelve la versión de sqlite a través del parámetro OUT. OK probado
*> sqlite3_libversion_number (OUT <int> ) *> Devuelve el número de versión como un int OK probado
*> sqlite3_open (<nombre de archivo>, OUT <controlador de la base de datos>). *> Esto abre un archivo de base de datos SQLite , nueva o existente como se especifica en el argumento de nombre de archivo.OK probado
*> sqlite3_close (<db-handle>)(<identificador de la base de datos>) *> Destructor de la interface , cierra la BD OK probado
*> sqlite3_exec (<gestor-bd>,<cadena-sql>) *> Es una envoltura sqlite3_prepare_v2(), sqlite3_step() y sqlite3_finalize() OK probado
*> sqlite3_errmsg (<db-handle>, OUT <mensaje de error) *> Devuelve texto en inglés como un parámetro OUT que describe el último error en la conexión. OK probado
*> sqlit3-statement functions
*> sqlite3_prepare_v2 *>Constructor OK probado
*> sqlite3_finalize *>Destructor OK probado
*> Pass
*> sqlite3_step int sqlite3_step(sqlite3_stmt*); OK probado
*> sqlite3_reset int sqlite3_reset(sqlite3_stmt *pStmt); OK probado
*> sqlite3_finalize int sqlite3_finalize(sqlite3_stmt *pStmt); OK probado
*> Statement column access (0-base indices)
*> sqlite3_column_count int sqlite3_column_count(sqlite3_stmt *pStmt); OK probado
*> sqlite3_column_type int sqlite3_column_type(sqlite3_stmt*, int iCol); OK probado
*> sqlite3_column_name const char *sqlite3_column_name(sqlite3_stmt*, int N); OK probado
*> Statement column type
*> sqlite3_column_int int sqlite3_column_int(sqlite3_stmt*, int iCol); OK probado
*> sqlite3_column_text const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); OK probado
*> sqlite3_column_double double sqlite3_column_double(sqlite3_stmt*, int iCol); OK probado
*> sqlite3_column_blob no implementado
Abrir BD
*------------------------------------------------------------------
*>sqlite3_open
* DISPLAY "------------".
* DISPLAY "sqlite3_open".
MOVE SPACES TO FUNCIONES-SQLITE3-LIB.
MOVE "sqlite3_open" TO FUNCIONES-SQLITE3-LIB.
MOVE "datos.db" & X"00" TO BD-FILE-NAME.
call FUNCIONES-SQLITE3-LIB WITH STDCALL LINKAGE
USING BY REFERENCE BD-FILE-NAME
BY REFERENCE BD-HANDLE
returning BD-STATUS
end-call.
IF BD-STATUS NOT = SQLITE_OK THEN
CALL "BD-ERROR"
ELSE
MOVE "OK" TO "Caption" OF CmStatic2
END-IF.
Crear BD
*------------------------------------------------------------------
*>sqlite3_exec
* DISPLAY "------------".
* DISPLAY "sqlite3_exec".
* DISPLAY "CREATE".
MOVE SPACES TO BD-SQL-QUERY.
MOVE SPACES TO FUNCIONES-SQLITE3-LIB.
MOVE "sqlite3_exec" TO FUNCIONES-SQLITE3-LIB.
MOVE "CREATE TABLE usuarios (id INTEGER PRIMARY KEY AUTOINCREMENT , nombre TEXT , edad INTEGER )" & X"00" TO BD-SQL-QUERY.
call FUNCIONES-SQLITE3-LIB WITH STDCALL LINKAGE
USING
BY VALUE BD-HANDLE
BY CONTENT BD-SQL-QUERY
BY VALUE 0
BY VALUE 0
BY VALUE 0
returning BD-STATUS
end-call.
IF BD-STATUS NOT = SQLITE_OK THEN
CALL "BD-ERROR"
ELSE
MOVE "OK" TO "Caption" OF CmStatic2
END-IF.
Insertar Registro BD
*------------------------------------------------------------------
*>sqlite3_exec
* DISPLAY "------------------".
* DISPLAY "sqlite3_exec".
* DISPLAY "INSERT".
MOVE SPACES TO FUNCIONES-SQLITE3-LIB.
MOVE "sqlite3_exec" TO FUNCIONES-SQLITE3-LIB.
MOVE SPACES TO BD-SQL-QUERY.
string "INSERT INTO usuarios (nombre , edad ) " delimited by size
" VALUES ('Leonardo' , 24 )" delimited by size
x"00" delimited by size
into BD-SQL-QUERY
end-string.
call FUNCIONES-SQLITE3-LIB WITH STDCALL LINKAGE
USING
BY VALUE BD-HANDLE
BY CONTENT BD-SQL-QUERY
BY VALUE 0
BY VALUE 0
BY VALUE 0
returning BD-STATUS
end-call.
IF BD-STATUS NOT = SQLITE_OK
CALL "BD-ERROR"
END-IF.
Actualizar Registro BD
PROCEDURE DIVISION.
*------------------------------------------------------------------
*>sqlite3_exec
* DISPLAY "------------------".
* DISPLAY "sqlite3_exec".
* DISPLAY "UPDATE".
MOVE SPACES TO FUNCIONES-SQLITE3-LIB.
MOVE SPACES TO BD-SQL-QUERY.
MOVE "sqlite3_exec" TO FUNCIONES-SQLITE3-LIB.
string "UPDATE usuarios SET nombre = 'xxxx' " delimited by size
" WHERE id = 1" delimited by size
x"00" delimited by size
into BD-SQL-QUERY
end-string.
call FUNCIONES-SQLITE3-LIB WITH STDCALL LINKAGE
USING
BY VALUE BD-HANDLE
BY CONTENT BD-SQL-QUERY
BY VALUE 0
BY VALUE 0
BY VALUE 0
returning BD-STATUS
end-call.
IF BD-STATUS NOT = SQLITE_OK
CALL "BD-ERROR"
ELSE
MOVE "OK" TO "Caption" OF CmStatic2
END-IF.
Cerar BD
*------------------------------------------------------------------
*>sqlite3_close
* DISPLAY "------------".
* DISPLAY "sqlite3_close".
MOVE SPACES TO FUNCIONES-SQLITE3-LIB.
MOVE "sqlite3_close" TO FUNCIONES-SQLITE3-LIB.
call FUNCIONES-SQLITE3-LIB WITH STDCALL LINKAGE
USING BY VALUE BD-HANDLE
returning BD-STATUS
end-call.
IF BD-STATUS NOT = SQLITE_OK THEN
CALL "BD-ERROR"
ELSE
MOVE "OK" TO "Caption" OF CmStatic2
END-IF.
Saludos....