sqlite
sqlite3_stmt: instruction préparée (API C)
Recherche…
Remarques
documentation officielle: objet déclaration préparé
Exécuter une déclaration
Une instruction est construite avec une fonction telle que sqlite3_prepare_v2 () .
Un objet d'instruction préparé doit être nettoyé avec sqlite3_finalize () . Ne l'oubliez pas en cas d'erreur.
Si des paramètres sont utilisés, définissez leurs valeurs avec les fonctions sqlite3_bind_xxx () .
L'exécution réelle se produit lorsque sqlite3_step () est appelée.
const char *sql = "INSERT INTO MyTable(ID, Name) VALUES (?, ?)";
sqlite3_stmt *stmt;
int err;
err = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
if (err != SQLITE_OK) {
printf("prepare failed: %s\n", sqlite3_errmsg(db));
return /* failure */;
}
sqlite3_bind_int (stmt, 1, 42); /* ID */
sqlite3_bind_text(stmt, 2, "Bob", -1, SQLITE_TRANSIENT); /* name */
err = sqlite3_step(stmt);
if (err != SQLITE_DONE) {
printf("execution failed: %s\n", sqlite3_errmsg(db));
sqlite3_finalize(stmt);
return /* failure */;
}
sqlite3_finalize(stmt);
return /* success */;
Lecture des données d'un curseur
Une requête SELECT est exécutée comme toute autre instruction. Pour lire les données renvoyées, appelez sqlite3_step () dans une boucle. Il retourne:
- SQLITE_ROW: si les données de la prochaine ligne sont disponibles ou
- SQLITE_DONE: s'il n'y a plus de lignes ou
- tout code d'erreur.
Si une requête ne renvoie aucune ligne, la toute première étape renvoie SQLITE_DONE.
Pour lire les données de la ligne en cours, appelez les fonctions sqlite3_column_xxx () :
const char *sql = "SELECT ID, Name FROM MyTable";
sqlite3_stmt *stmt;
int err;
err = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
if (err != SQLITE_OK) {
printf("prepare failed: %s\n", sqlite3_errmsg(db));
return /* failure */;
}
for (;;) {
err = sqlite3_step(stmt);
if (err != SQLITE_ROW)
break;
int id = sqlite3_column_int (stmt, 0);
const char *name = sqlite3_column_text(stmt, 1);
if (name == NULL)
name = "(NULL)";
printf("ID: %d, Name: %s\n", id, name);
}
if (err != SQLITE_DONE) {
printf("execution failed: %s\n", sqlite3_errmsg(db));
sqlite3_finalize(stmt);
return /* failure */;
}
sqlite3_finalize(stmt);
return /* success */;
Exécuter une déclaration préparée plusieurs fois
Une fois qu'une instruction a été exécutée , un appel à sqlite3_reset () le ramène à son état d'origine pour qu'il puisse être ré-exécuté.
En général, alors que l'instruction elle-même reste la même, les paramètres sont modifiés:
const char *sql = "INSERT INTO MyTable(ID, Name) VALUES (?, ?)";
sqlite3_stmt *stmt;
int err;
err = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
if (err != SQLITE_OK) {
printf("prepare failed: %s\n", sqlite3_errmsg(db));
return /* failure */;
}
for (...) {
sqlite3_bind_int (stmt, 1, ...); /* ID */
sqlite3_bind_text(stmt, 2, ...); /* name */
err = sqlite3_step(stmt);
if (err != SQLITE_DONE) {
printf("execution failed: %s\n", sqlite3_errmsg(db));
sqlite3_finalize(stmt);
return /* failure */;
}
sqlite3_reset(stmt);
}
sqlite3_finalize(stmt);
return /* success */;