English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Dans ce chapitre, vous apprendrez à utiliser SQLite en C / C ++Nous utilisons SQLite.
Dans nos programmes C / C ++Avant de commencer à utiliser SQLite dans votre programme, vous devez vous assurer que la bibliothèque SQLite est installée sur votre ordinateur. Vous pouvez consulter le chapitre 'Installation SQLite' pour en savoir plus sur le processus d'installation.
Voici des API importantes en C / C ++ Exemples d'interface SQLite, qui suffisent pour vous permettre de commencer à utiliser SQLite en C / C ++Les exigences du programme pour l'utilisation de la base de données SQLite. Si vous cherchez des applications plus complexes, vous pouvez consulter la documentation officielle SQLite.
Numéro | API et description |
---|---|
1 | sqlite3_open(const char *filename, sqlite3 **ppDb) Cette routine ouvre une connexion avec le fichier de base de données SQLite et renvoie un objet de connexion de base de données, à utiliser pour d'autres routines SQLite. sifilenamesi le paramètre est NULL ou ':memory:', alors sqlite3_open() créera une base de données en mémoire, qui ne durera que pendant la session. si le nom de fichier n'est pas NULL, alors sqlite3_open() tente d'ouvrir le fichier de base de données en utilisant sa valeur. Si le fichier nommé n'existe pas, sqlite3_open() ouvre un nouveau fichier de base de données avec ce nom. |
2 | sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg) Cette routine fournit une méthode rapide et simple pour exécuter les commandes SQL fournies par le paramètre sql, qui peut être composé de plusieurs commandes SQL. ici, le premier paramètresqlite3est un objet de base de données ouverte,sqlite_callbackest une fonction de rappel quidonnéesest le premier paramètre et renverra errmsg pour capturer toute erreur levée par la routine. sqlite3_exec() routine analyse et exécutesqlpour chaque commande donnée dans les paramètres, jusqu'à la fin de la chaîne ou en cas d'erreur. |
3 | sqlite3_close(sqlite3*) Cette routine ferme les commandes précédentes appelées via 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, "Failed to open database: %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; /*Open database*/ rc = sqlite3_open("test.db", &db); if( rc ) { fprintf(stderr, "Failed to open database: %s\n", sqlite3_errmsg(db)); return(0); } else { fprintf(stdout, "已成功打开数据库\n"); } /* Créer une instruction 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 = sqlite3_exec(db, sql, callback, 0, &zErrMsg); if( rc != SQLITE_OK ) { fprintf(stderr, "SQL error: %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; /* Ouvrir la base de données */ rc = sqlite3_open("test.db", &db); if( rc ) { fprintf(stderr, "Failed to open database: %s\n", sqlite3_errmsg(db)); return(0); } else { fprintf(stderr, "Database successfully opened\n"); } /* Créer une instruction SQL */ sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \ "VALUES (1, 'Paul', 32, 'California', 20000.00 )" \ "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \ "VALUES (2, 'Allen', 25, 'Texas', 15000.00 ) ;" \ "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \ "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 )" \ "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \ "VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );"; /* Execute the SQL statement */ rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg); if( rc != SQLITE_OK ) { fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } else { fprintf(stdout, "Enregistrement créé avec succès\n"); } sqlite3_close(db); return 0; }
Après compilation et exécution du programme ci-dessus, il créera l'enregistrement donné dans la table COMPANY et affichera les deux lignes suivantes-
Base de données ouverte avec succès Enregistrement créé avec succès
Avant de continuer à l'exemple réel pour obtenir les enregistrements, regardons quelques détails sur les fonctions de rappel utilisées dans l'exemple. Le rappel fournit une méthode pour obtenir les résultats d'une instruction SELECT. Il a la déclaration suivante-
typedef int (*sqlite3_callback) ( void*, /* dans sqlite3du _exec()4données fournies dans les */ int, /* Nombre de colonnes dans la ligne */ char**, /* Tableau de chaînes représentant les champs de la ligne */ char** /* Tableau de chaînes représentant les noms de colonnes */ );
Si le rappel ci-dessus est fourni en tant que troisième paramètre dans la routine sqlite_exec(), SQLite appelle cette fonction de rappel pour chaque enregistrement traité dans chaque instruction SELECT exécutée dans les paramètres SQL.
Le code C suivant montre comment obtenir et afficher les enregistrements à partir de la table COMPANY créée dans l'exemple précédent.-
#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"; /* Open database */ rc = sqlite3_open("test.db", &db); if( rc ) { fprintf(stderr, "Failed to open database: %s\n", sqlite3_errmsg(db)); return(0); } else { fprintf(stderr, "Database successfully opened\n"); } /* Créer une instruction SQL */ sql = "SELECT * from COMPANY"; /* Execute the SQL statement */ rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg); if( rc != SQLITE_OK ) { fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } else { fprintf(stdout, "Opération réussie\n"); } sqlite3_close(db); return 0; }
After compiling and executing the above program, the following results will be produced.
Base de données ouverte avec succès Fonction d'appel retournée : ID = 1 NAME = Paul AGE = 32 ADDRESS = California SALARY = 20000.0 Fonction d'appel retournée : ID = 2 NAME = Allen AGE = 25 ADDRESS = Texas SALARY = 15000.0 Fonction d'appel retournée : ID = 3 NAME = Teddy AGE = 23 ADDRESS = Norway SALARY = 20000.0 Fonction d'appel retournée : ID = 4 NAME = Mark AGE = 25 ADDRESS = Rich-Mond SALARY = 65000.0 Opération réussie
Le code C suivant montre comment utiliser l'instruction UPDATE pour mettre à jour n'importe quel enregistrement, puis obtenir et afficher l'enregistrement mis à jour dans la table 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"; /* Ouvrir la base de données */ rc = sqlite3_open("test.db", &db); if( rc ) { fprintf(stderr, "Failed to open database: %s\n", sqlite3_errmsg(db)); return(0); } else { fprintf(stderr, "Database successfully opened\n"); } /*Create a combined SQL statement*/ sql = "MISE À JOUR COMPANY SET SALARY = 25000.00 où ID=1; \ "SELECT * from COMPANY"; /* Execute the SQL statement */ rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg); if( rc != SQLITE_OK ) { fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } else { fprintf(stdout, "Operation done successfully\n"); } sqlite3_close(db); return 0; }
After compiling and executing the above program, the following results will be produced.
Base de données ouverte avec succès Fonction d'appel retournée : ID = 1 NAME = Paul AGE = 32 ADDRESS = California SALARY = 25000.0 Fonction d'appel retournée : ID = 2 NAME = Allen AGE = 25 ADDRESS = Texas SALARY = 15000.0 Fonction d'appel retournée : ID = 3 NAME = Teddy AGE = 23 ADDRESS = Norway SALARY = 20000.0 Fonction d'appel retournée : ID = 4 NAME = Mark AGE = 25 ADDRESS = Rich-Mond SALARY = 65000.0 Opération effectuée avec succès
The following C code segment shows how to use the DELETE statement to delete any record and then retrieve and display the remaining records from the COMPANY table.
#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"; /* Open database */ rc = sqlite3_open("test.db", &db); if( rc ) { fprintf(stderr, "Failed to open database: %s\n", sqlite3_errmsg(db)); return(0); } else { fprintf(stderr, "Database successfully opened\n"); } /* Create a combined SQL statement */ sql = "DELETE from COMPANY where ID="2; \ "SELECT * from COMPANY"; /* Execute the SQL statement */ rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg); if( rc != SQLITE_OK ) { fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } else { fprintf(stdout, "Operation done successfully\n"); } sqlite3_close(db); return 0; }
After compiling and executing the above program, the following results will be produced.
Base de données ouverte avec succès Fonction d'appel retournée : ID = 1 NAME = Paul AGE = 32 ADDRESS = California SALARY = 20000.0 Fonction d'appel retournée : ID = 3 NAME = Teddy AGE = 23 ADDRESS = Norway SALARY = 20000.0 Fonction d'appel retournée : ID = 4 NAME = Mark AGE = 25 ADDRESS = Rich-Mond SALARY = 65000.0 Opération effectuée avec succès