SQLite - C/C++ pour débutants
Bonjour là-bas, aspirants programmeurs ! Aujourd'hui, nous allons entreprendre un voyage passionnant dans le monde de SQLite en utilisant C/C++. Ne vous inquiétez pas si vous n'avez jamais écrit une ligne de code auparavant - nous allons commencer par les bases et progresser pas à pas. À la fin de ce tutoriel, vous serez étonné de ce que vous pouvez accomplir !
Qu'est-ce que SQLite ?
Avant de plonger dans le code, comprenons ce qu'est SQLite. Imaginez que vous avez un carnet numérique où vous pouvez stocker toutes sortes d'informations de manière organisée. C'est essentiellement ce qu'est SQLite - une base de données légère, basée sur des fichiers, qui ne nécessite pas un processus de serveur séparé. C'est comme avoir un mini-base de données dans votre poche !
APIs de l'interface C/C++
Pour interagir avec SQLite en utilisant C/C++, nous devons utiliser quelque chose appelé APIs (Interfaces de Programmation Appliquée). Pensez à ces outils spéciaux qui permettent à notre programme C/C++ de communiquer avec SQLite. Voici les principales APIs que nous utiliserons :
Fonction API | Description |
---|---|
sqlite3_open() | Ouvre une connexion à une base de données SQLite |
sqlite3_exec() | Exécute des instructions SQL |
sqlite3_close() | Ferme la connexion à la base de données |
sqlite3_errmsg() | Retourne des messages d'erreur |
Ne vous inquiétez pas si cela semble intimidant maintenant. Nous explorerons chacun d'eux avec plein d'exemples !
Connecter à une base de données
Commençons par nous connecter à une base de données. C'est comme ouvrir notre carnet numérique pour commencer à écrire.
#include <stdio.h>
#include <sqlite3.h>
int main() {
sqlite3 *db;
int rc = sqlite3_open("test.db", &db);
if (rc) {
fprintf(stderr, "Impossible d'ouvrir la base de données: %s\n", sqlite3_errmsg(db));
return(0);
} else {
fprintf(stderr, "Base de données ouverte avec succès\n");
}
sqlite3_close(db);
return 0;
}
Décomposons cela :
- Nous incluons les headers nécessaires :
stdio.h
pour les entrées/sorties etsqlite3.h
pour les fonctions SQLite. - Dans
main()
, nous déclarons un pointeur verssqlite3
, qui représente notre connexion à la base de données. - Nous utilisons
sqlite3_open()
pour ouvrir (ou créer) une base de données nommée "test.db". - Nous vérifions si la connexion a réussi. Si non, nous affichons un message d'erreur.
- Enfin, nous fermons la connexion à la base de données avec
sqlite3_close()
.
Créer une table
Maintenant que notre carnet est ouvert, créons une page pour stocker certaines informations. En termes de base de données, nous appelons cela une table.
int main() {
sqlite3 *db;
char *zErrMsg = 0;
int rc;
rc = sqlite3_open("test.db", &db);
if (rc) {
fprintf(stderr, "Impossible d'ouvrir la base de données: %s\n", sqlite3_errmsg(db));
return(0);
}
char *sql = "CREATE TABLE STUDENTS("
"ID INT PRIMARY KEY NOT NULL,"
"NAME TEXT NOT NULL,"
"AGE INT NOT NULL,"
"GRADE CHAR(1) );";
rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "Erreur SQL: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Table créée avec succès\n");
}
sqlite3_close(db);
return 0;
}
Dans cet exemple :
- Nous ouvrons la base de données comme avant.
- Nous définissons une instruction SQL pour créer une table nommée STUDENTS avec des colonnes pour ID, NAME, AGE et GRADE.
- Nous utilisons
sqlite3_exec()
pour exécuter cette instruction SQL. - Nous vérifions si l'exécution a réussi et affichons un message approprié.
Opération INSERT
Super ! Nous avons notre table. Maintenant, ajoutons des données.
char *sql = "INSERT INTO STUDENTS (ID,NAME,AGE,GRADE) "
"VALUES (1, 'Alice', 20, 'A' ); "
"INSERT INTO STUDENTS (ID,NAME,AGE,GRADE) "
"VALUES (2, 'Bob', 21, 'B' ); ";
rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "Erreur SQL: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Records insérés avec succès\n");
}
Ici, nous insérons deux enregistrements dans notre table STUDENTS. L'instruction SQL utilise la syntaxe INSERT INTO pour ajouter de nouvelles lignes.
Opération SELECT
Maintenant, récupérons les données que nous venons d'insérer. C'est là que la magie des bases de données brille vraiment !
static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
for(int i = 0; i < argc; i++) {
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
// Dans main()
char *sql = "SELECT * from STUDENTS";
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "Erreur SQL: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Opération effectuée avec succès\n");
}
Cet exemple introduit une fonction de rappel. Lorsque nous sélectionnons des données, SQLite appelle cette fonction pour chaque ligne du résultat. C'est comme avoir un assistant qui lit chaque entrée de notre carnet !
Opération UPDATE
Et si nous avons fait une erreur et devons modifier certaines données ? C'est là que rentre en jeu UPDATE.
char *sql = "UPDATE STUDENTS set GRADE = 'A' where ID=2";
rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "Erreur SQL: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Records mis à jour avec succès\n");
}
Cette instruction SQL change la note de Bob en A. Bon boulot, Bob !
Opération DELETE
Parfois, nous devons supprimer des données. Voyons comment supprimer un enregistrement.
char *sql = "DELETE from STUDENTS where ID=2";
rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "Erreur SQL: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Enregistrement supprimé avec succès\n");
}
Cela supprime l'enregistrement de Bob de notre table. Désolé, Bob !
Et voilà ! Nous avons couvert les bases de la lavoration avec SQLite en C/C++. Souvenez-vous, programmer, c'est comme apprendre une nouvelle langue - cela nécessite de la pratique. Ne soyez pas découragé si les choses ne sont pas immédiates. Continuez à expérimenter, et bientôt vous serez capable d'écrire des applications de base de données comme un pro !
Credits: Image by storyset