sqlite
sqlite3_stmt: Prepared-Anweisung (C-API)
Suche…
Bemerkungen
offizielle Dokumentation: Prepared Statement Object
Anweisung ausführen
Eine Anweisung wird mit einer Funktion wie sqlite3_prepare_v2 () erstellt .
Ein vorbereitetes Anweisungsobjekt muss mit sqlite3_finalize () aufgeräumt werden. Vergessen Sie dies im Fehlerfall nicht.
Wenn Parameter verwendet werden, legen Sie ihre Werte mit den Funktionen sqlite3_bind_xxx () fest .
Die eigentliche Ausführung findet statt, wenn sqlite3_step () aufgerufen wird.
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 */;
Daten aus einem Cursor lesen
Eine SELECT - Abfrage wird ausgeführt wie jede andere Aussage. Um die zurückgegebenen Daten zu lesen, rufen Sie sqlite3_step () in einer Schleife auf. Es gibt zurück:
- SQLITE_ROW: wenn die Daten für die nächste Zeile verfügbar sind, oder
- SQLITE_DONE: wenn keine weiteren Zeilen vorhanden sind, oder
- ein beliebiger Fehlercode
Wenn eine Abfrage keine Zeilen zurückgibt, gibt der allererste Schritt SQLITE_DONE zurück.
Um die Daten aus der aktuellen Zeile zu lesen, rufen Sie die Funktionen sqlite3_column_xxx () auf :
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 */;
Eine vorbereitete Anweisung mehrmals ausführen
Nachdem eine Anweisung ausgeführt wurde , wird sie durch einen Aufruf von sqlite3_reset () wieder in den ursprünglichen Zustand versetzt, damit sie erneut ausgeführt werden kann.
Während die Anweisung selbst gleich bleibt, werden die Parameter normalerweise geändert:
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 */;