SQLiteデータベースの操作
データベースのopen/close
SQLiteデータベースは通常のファイルと同様、使う前にopen、使った後にcloseしなければなりません。
sqlite3* db; int result = sqlite3_open("d:\\data\\trial.db", &db);
上記のように、データベース・ファイルのパスとデータベース・ハンドル(sqlite3*)のポインタを与えます。指定したファイルが存在しないときは新規に作成されます。データベース・ファイルパスに":memory:"を指定するとデータベースがメモリ内に作られ、アプリケーション実行時にのみ有効な揮発性データベースとして使えます。
戻り値は処理の結果を表し、SQLITE_OKであれば成功、失敗時にはエラーコードが返されます。最後に呼び出された関数の結果に対応するエラーメッセージはconst char* sqltie3_err_msg()で取得できます。
sqlite3* db; int result = sqlite3_open(":memory:", &db); if ( result != SQLITE_OK ) { cerr << sqlite3_errmsg() << ensl; return; }
データベースの使用を終えるときは:
sqlite3_close(db);
してください。
SQLの実行
SQLの実行は大きく2つのフェーズ「prepare」と「step」に分かれます。「prepar」ではSQL文をあらかじめコンパイル(構文解釈)し、実行に備えます。
int sqlite3_prepare_v2( sqlite3* db, /* データベース・ハンドル */ const char* zSql, /* SQL文 */ int nByte, /* zSqlのバイト長 */ sqlite3_stmt** ppStmt, /* ステートメント・ハンドル (out) */ const char** pzTail /* zSqlの後続部 (out) */ );
zSqlに与えたSQL文がコンパイルされ、ステートメント・ハンドル(sqlite3_stmt*)が*ppStmtに出力されます。nByteは文字数ではなくバイト数であることに留意してください(-1とすればSQL文が'\0'終端されているとみなします)。
sqlite3* db; sqlite3_stmt* statement; int result = sqlite3_prepare_v2(db, "BEGIN TRANSACTION", -1, &statement, 0); assert(result == SQLITE_OK);
SQLの実行はステートメント・ハンドルに対して行われます。実行後のステートメント・ハンドルはsqlite3_finalize()で破棄してください。
result = sqlite3_step(statement);
assert(result == SQLITE_DONE);
sqltie3_finalize(statement);
最後の引数const char** pzTailは';'で区切られた複数行からなるSQL文のコンパイルに用います。sqlite3_prepare_v2()は与えられたSQL文の最初の1つをコンパイルし、続くSQL文の先頭を*pzTailにセットします。
const char* command = "DROP TABLE price_list;" "CREATE TABLE price_list ( item TEXT, price INTEGER)"; while ( *command ) { sqlite3_stmt* statement; sqlite3_prepare_v2(db, command, -1, &statement, &command); sqlite_step(statement); sqlite_finalize(statement); }
値のバインド
- ?
- ?NNN
- :VVV
- @VVV
- $VVV
SQL文中に上記の文字列(プレースホルダ)を置くことで、sqlite_bind*()によってその位置に値を差し込むことができます。
- int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
- int sqlite3_bind_double(sqlite3_stmt*, int, double);
- int sqlite3_bind_int(sqlite3_stmt*, int, int);
- int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64);
- int sqlite3_bind_null(sqlite3_stmt*, int);
- int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*));
それぞれblob、double、int、int64(64bit整数)、null、文字列を指定したプレースホルダにバインドします。引数は以下のとおりです。
- ステートメント・ハンドル
- プレースホルダの位置(最初のプレースホルダを1とする)
- バインド値
- バインド値のバイト数
- デストラクタ……実行完了時にバインド値を引数として呼び出される関数へのポインタ。バインド値が実行中に変化しないのであればSQLITE_STATIC、バインド値のコピーをステートメントが保持するならSQLITE_TRANSIENTを指定できます。
sqlite3_stmt* statement; const char* command = "INSERT INTO mul_table VALUES ( ?, ?, ? );"; sqlite3_prepare_v2(db, command, -1, &statement, 0); for ( int x = 1; x < 10; ++x ) { for ( int y = 1; y < 10; ++y ) { int z = x*y; sqlite3_reset(statement); sqlite3_bind_int(statement,1,x); sqlite3_bind_int(statement,2,y); sqlite3_bind_int(statement,3,z); sqlite3_step(statement); } }
