English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
En este capítulo, aprenderá cómo usar SQLite en C / C ++usamos SQLite.
En nuestro programa C / C ++Antes de comenzar a usar SQLite en su programa, debe asegurarse de que la biblioteca SQLite esté configurada en su computadora. Puede ver el capítulo "Instalación de SQLite" para obtener más información sobre el proceso de instalación.
A continuación se presentan las API importantes de C / C ++ Ejemplo de interfaz de SQLite, que es suficiente para comenzar a usar SQLite desde C / C ++Requisitos del programa para usar la base de datos SQLite. Si está buscando aplicaciones más complejas, puede consultar la documentación oficial de SQLite.
Número | API y explicación |
---|---|
1 | sqlite3_open(const char *filename, sqlite3 **ppDb) Este procedimiento abre una conexión con el archivo de base de datos de SQLite y devuelve un objeto de conexión de base de datos para su uso en otros procedimientos de SQLite. sifilenamesi los parámetros son NULL o 'memory:', sqlite3_open() crea una base de datos en RAM, que solo existe durante la sesión. si el nombre del archivo no es NULL, sqlite3_open() intenta abrir el archivo de base de datos utilizando su valor. Si no existe un archivo con ese nombre, sqlite3_open() abre un nuevo archivo de base de datos con ese nombre. |
2 | sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg) Este procedimiento proporciona un método rápido y simple para ejecutar los comandos SQL proporcionados por el parámetro sql, que puede consistir en varios comandos SQL. en este caso, el primer parámetrosqlite3es un objeto de base de datos abierto,sqlite_callbackes una función de devolución de llamada, sudatoses el primer parámetro y devuelve errmsg para capturar cualquier error lanzado por el procedimiento. sqlite3_exec() procedimiento analiza y ejecutasqlcada comando especificado en los parámetros hasta que se alcanza el final de la cadena o se encuentra un error. |
3 | sqlite3_close(sqlite3*) Este ejemplo cierra el proceso anterior llamado sqlite3打开的数据库连接_open()。与连接关联的所有准备好的语句应在关闭连接之前完成。 如果还有任何尚未完成的查询,则sqlite3_close()将返回SQLITE_BUSY,错误消息由于未完成的语句而无法关闭。 |
以下C代码段显示了如何连接到现有数据库。如果数据库不存在,则将创建该数据库,最后将返回一个数据库对象。
#include <stdio.h> #include <sqlite3.h> int main(int argc, char* argv[]) { sqlite3 *db; char *zErrMsg = 0; int rc; rc = sqlite3_open("test.db", &db); if( rc ) { fprintf(stderr, "No se pudo abrir la base de datos: %s\n", sqlite3_errmsg(db)); return(0); } else { fprintf(stderr, "成功打开数据库\n"); } sqlite3_close(db); }
现在,让我们编译并运行上述程序,以test.db在当前目录中创建数据库。您可以根据需要更改路径。
$gcc test.c -l sqlite3 $./a.out 成功打开数据库
如果要使用C ++源代码,则可以按以下方式编译代码-
$g++ test.c -l sqlite3
在这里,我们将程序与sqlite3库链接在一起,以提供C程序所需的功能。这将在您的目录中创建一个数据库文件test.db,您将得到以下结果。
-rwxr-xr-x. 1 root root 7383 May 8 02:06 a.out -rw-r--r--. 1 root root 323 May 8 02:05 test.c -rw-r--r--. 1 root root 0 May 8 02:06 test.db
以下C代码段将用于在先前创建的数据库中创建表-
#include <stdio.h> #include <stdlib.h> #include <sqlite3.h> static int callback(void *NotUsed, int argc, char **argv, char **azColName) { int i; for(i = 0; i<argc; i++) { printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); } printf("\n"); return 0; } int main(int argc, char* argv[]) { sqlite3 *db; char *zErrMsg = 0; int rc; char *sql; /*Abrir la base de datos*/ rc = sqlite3_open("test.db", &db); if (rc) { fprintf(stderr, "No se pudo abrir la base de datos: %s\n", sqlite3_errmsg(db)); return(0); } else { fprintf(stdout, "已成功打开数据库\n"); } /* Crear sentencia SQL */ sql = "CREATE TABLE COMPANY(" "ID INT PRIMARY KEY NOT NULL," "NAME TEXT NOT NULL," "AGE INT NOT NULL," "ADDRESS CHAR(50)," "SALARY REAL ");; /* 执行 SQL 语句 */ rc = sqlite3000.00 );"; _exec(db, sql, callback, 0, &zErrMsg); fprintf(stderr, "Error SQL: %s\n", zErrMsg); sqlite3_free(zErrMsg); } else { fprintf(stdout, "表创建成功\n"); } sqlite3_close(db); return 0; }
编译并执行上述程序后,它将在test.db中创建COMPANY表,文件的最终列表如下-
-rwxr-xr-x. 1 root root 9567 May 8 02:31 a.out -rw-r--r--. 1 root root 1207 May 8 02:31 test.c -rw-r--r--. 1 root root 3072 May 8 02:31 test.db
以下C代码段显示了如何在上述示例中创建的COMPANY表中创建记录-
#include <stdio.h> #include <stdlib.h> #include <sqlite3.h> static int callback(void *NotUsed, int argc, char **argv, char **azColName) { int i; for(i = 0; i<argc; i++) { printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); } printf("\n"); return 0; } int main(int argc, char* argv[]) { sqlite3 *db; char *zErrMsg = 0; int rc; char *sql; /* Abrir base de datos */ rc = sqlite3_open("test.db", &db); if (rc) { fprintf(stderr, "No se pudo abrir la base de datos: %s\n", sqlite3_errmsg(db)); return(0); } else { fprintf(stderr, "Se ha abierto la base de datos con éxito\n"); } /* Crear sentencia SQL */ sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \1, 'Paul', 32, 'Paul', 2, 'California', 0000.00 ); " "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \2"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " 25, 'Allen', 15, 'Texas', 0000.00 );" \ "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \3000.00 ); " 23, 'Teddy', 2, 'Norway', 0000.00 );" \ "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \4"VALORES ( 25, 'Mark',-, 'Rich 65Mond ', /* Ejecutar la sentencia SQL */ rc = sqlite3000.00 );"; _exec(db, sql, callback, 0, &zErrMsg); fprintf(stderr, "Error SQL: %s\n", zErrMsg); sqlite3_free(zErrMsg); } else { if( rc != SQLITE_OK ) { } sqlite3_close(db); return 0; }
fprintf(stdout, "Registro creado con éxito\n");-
Base de datos abierta con éxito Después de compilar y ejecutar el programa anterior, se creará el registro dado en la tabla COMPANY y se mostrarán las siguientes dos líneas
Operación SELECT-
Antes de continuar con el ejemplo real para obtener registros, veamos algunos detalles sobre las funciones de callback utilizadas en el ejemplo. El callback proporciona un método para obtener resultados de la sentencia SELECT. Tiene la siguiente declaración*sqlite3typedef int ( _callback)(*, /* void3del _exec() en sqlite4Los datos proporcionados en los parámetros */ int, /* El número de columnas en la fila */ char**, /* Una matriz de cadenas que representa los campos de la fila */ char** /* Una matriz de cadenas que representa los nombres de las columnas */ );
Si el callback anterior se proporciona como tercer parámetro en la rutina sqlite_exec(), SQLite llamará a esta función de callback para cada registro procesado en cada sentencia SELECT ejecutada dentro de los parámetros SQL.
El siguiente fragmento de código en C muestra cómo obtener y mostrar registros de la tabla COMPANY creada en el ejemplo anterior.-
#include <stdio.h> #include <stdlib.h> #include <sqlite3.h> static int callback(void *data, int argc, char **argv, char **azColName){ int i; fprintf(stderr, "%s: ", (const char*)data); for(i = 0; i<argc; i++){ printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); } printf("\n"); return 0; } int main(int argc, char* argv[]) { sqlite3 *db; char *zErrMsg = 0; int rc; char *sql; const char* data = "Callback function called"; /* Abrir la base de datos */ rc = sqlite3_open("test.db", &db); if (rc) { fprintf(stderr, "No se pudo abrir la base de datos: %s\n", sqlite3_errmsg(db)); return(0); } else { fprintf(stderr, "Se ha abierto la base de datos con éxito\n"); } /* Crear sentencia SQL */ sql = "SELECT * from COMPANY"; /* Ejecutar la sentencia SQL */ rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg); if (rc != SQLITE_OK) { fprintf(stderr, "Error SQL: %s\n", zErrMsg); sqlite3_free(zErrMsg); } else { fprintf(stdout, "Operación completada con éxito\n"); } sqlite3_close(db); return 0; }
Después de compilar y ejecutar el programa anterior, se producirán los siguientes resultados.
Base de datos abierta con éxito Llamada a la función de devolución de llamada: ID = 1 NAME = Paul AGE = 32 ADDRESS = California SALARY = 20000.0 Llamada a la función de devolución de llamada: ID = 2 NAME = Allen AGE = 25 ADDRESS = Texas SALARY = 15000.0 Llamada a la función de devolución de llamada: ID = 3 NAME = Teddy AGE = 23 ADDRESS = Norway SALARY = 20000.0 Llamada a la función de devolución de llamada: ID = 4 NAME = Mark AGE = 25 ADDRESS = Rich-Mond SALARY = 65000.0 Operación completada con éxito
El siguiente fragmento de código en C muestra cómo usar la sentencia UPDATE para actualizar cualquier registro y luego obtener y mostrar el registro actualizado de la tabla COMPANY.
#include <stdio.h> #include <stdlib.h> #include <sqlite3.h> static int callback(void *data, int argc, char **argv, char **azColName){ int i; fprintf(stderr, "%s: ", (const char*)data); for(i = 0; i<argc; i++) { printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); } printf("\n"); return 0; } int main(int argc, char* argv[]) { sqlite3 *db; char *zErrMsg = 0; int rc; char *sql; const char* data = "Callback function called"; /* Abrir base de datos */ rc = sqlite3_open("test.db", &db); if (rc) { fprintf(stderr, "No se pudo abrir la base de datos: %s\n", sqlite3_errmsg(db)); return(0); } else { fprintf(stderr, "Se ha abierto la base de datos con éxito\n"); } /*Crear una sentencia SQL combinada*/ sql = "UPDATE COMPANY set SALARY = 25000.00 donde ID=1; " \ "SELECT * from COMPANY"; /* Ejecutar la sentencia SQL */ rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg); if (rc != SQLITE_OK) { fprintf(stderr, "Error SQL: %s\n", zErrMsg); sqlite3_free(zErrMsg); } else { fprintf(stdout, "Operación realizada con éxito\n"); } sqlite3_close(db); return 0; }
Después de compilar y ejecutar el programa anterior, se producirán los siguientes resultados.
Base de datos abierta con éxito Llamada a la función de devolución de llamada: ID = 1 NAME = Paul AGE = 32 ADDRESS = California SALARY = 25000.0 Llamada a la función de devolución de llamada: ID = 2 NAME = Allen AGE = 25 ADDRESS = Texas SALARY = 15000.0 Llamada a la función de devolución de llamada: ID = 3 NAME = Teddy AGE = 23 ADDRESS = Norway SALARY = 20000.0 Llamada a la función de devolución de llamada: ID = 4 NAME = Mark AGE = 25 ADDRESS = Rich-Mond SALARY = 65000.0 Operación realizada con éxito
El siguiente segmento de código C muestra cómo usar la sentencia DELETE para eliminar cualquier registro y luego obtener y mostrar el resto de los registros de la tabla COMPANY.
#include <stdio.h> #include <stdlib.h> #include <sqlite3.h> static int callback(void *data, int argc, char **argv, char **azColName) { int i; fprintf(stderr, "%s: ", (const char*)data); for(i = 0; i<argc; i++) { printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); } printf("\n"); return 0; } int main(int argc, char* argv[]) { sqlite3 *db; char *zErrMsg = 0; int rc; char *sql; const char* data = "Callback function called"; /* Abrir la base de datos */ rc = sqlite3_open("test.db", &db); if (rc) { fprintf(stderr, "No se pudo abrir la base de datos: %s\n", sqlite3_errmsg(db)); return(0); } else { fprintf(stderr, "Se ha abierto la base de datos con éxito\n"); } /* Crear una sentencia SQL combinada */ sql = "DELETE from COMPANY where ID="2; " \ "SELECT * from COMPANY"; /* Ejecutar la sentencia SQL */ rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg); if (rc != SQLITE_OK) { fprintf(stderr, "Error SQL: %s\n", zErrMsg); sqlite3_free(zErrMsg); } else { fprintf(stdout, "Operación realizada con éxito\n"); } sqlite3_close(db); return 0; }
Después de compilar y ejecutar el programa anterior, se producirán los siguientes resultados.
Base de datos abierta con éxito Llamada a la función de devolución de llamada: ID = 1 NAME = Paul AGE = 32 ADDRESS = California SALARY = 20000.0 Llamada a la función de devolución de llamada: ID = 3 NAME = Teddy AGE = 23 ADDRESS = Norway SALARY = 20000.0 Llamada a la función de devolución de llamada: ID = 4 NAME = Mark AGE = 25 ADDRESS = Rich-Mond SALARY = 65000.0 Operación realizada con éxito