sqlite
sqlite3_stmt: istruzione preparata (API C)
Ricerca…
Osservazioni
documentazione ufficiale: oggetto Statement preparato
Esecuzione di una dichiarazione
Una dichiarazione è costruita con una funzione come sqlite3_prepare_v2 () .
Un oggetto statement preparato deve essere ripulito con sqlite3_finalize () . Non dimenticarlo in caso di errore.
Se si utilizzano i parametri , impostare i loro valori con le funzioni sqlite3_bind_xxx () .
L'esecuzione effettiva avviene quando viene chiamato sqlite3_step () .
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 */;
Lettura dei dati da un cursore
Una query SELECT viene eseguita come qualsiasi altra istruzione. Per leggere i dati restituiti, chiama sqlite3_step () in un ciclo. Restituisce:
- SQLITE_ROW: se i dati per la riga successiva sono disponibili, o
- SQLITE_DONE: se non ci sono più righe, o
- qualsiasi codice di errore.
Se una query non restituisce alcuna riga, il primo passaggio restituisce SQLITE_DONE.
Per leggere i dati dalla riga corrente, chiama le funzioni 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 */;
Esecuzione di una dichiarazione preparata più volte
Dopo l' esecuzione di una dichiarazione, una chiamata a sqlite3_reset () lo riporta nello stato originale in modo che possa essere rieseguito.
In genere, mentre l'istruzione rimane invariata, i parametri vengono modificati:
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 */;