sqlite
sqlite3_stmt:プリペアドステートメント(C API)
サーチ…
備考
公式ドキュメント: Prepared Statementオブジェクト
ステートメントの実行
ステートメントは、 sqlite3_prepare_v2()などの関数で作成されます。
プリペアドステートメントオブジェクトは 、 sqlite3_finalize()でクリーンアップする必要があります。エラーの場合は、このことを忘れないでください。
パラメータを使用する場合は、 sqlite3_bind_xxx()関数を使用して値を設定します。
実際の実行は、 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 */;
カーソルからのデータの読み取り
SELECTクエリは他のステートメントと同様に実行されます。返されたデータを読み取るには、ループ内でsqlite3_step()を呼び出します。それは返す:
- SQLITE_ROW:次の行のデータが使用可能かどうか、または
- SQLITE_DONE:それ以上行がない場合、または
- 任意のエラーコード。
問合せが行を戻さない場合は、最初の手順でSQLITE_DONEが戻されます。
現在の行からデータを読み取るには、 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 */;
準備されたステートメントを複数回実行する
文が実行された後、 sqlite3_reset()を呼び出すと、元の状態に戻り、再実行されます。
通常、ステートメント自体は同じままですが、パラメーターは変更されます。
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 */;
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow