CodeZine(コードジン)

特集ページ一覧

SQLiteで“おこづかいちょう”

SQLite、C++/CLI、C#で実用(?)アプリケーションを作る

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2008/05/14 14:00
目次

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
  • (NNN:1~999、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. ステートメント・ハンドル
  2. プレースホルダの位置(最初のプレースホルダを1とする)
  3. バインド値
  4. バインド値のバイト数
  5. デストラクタ……実行完了時にバインド値を引数として呼び出される関数へのポインタ。バインド値が実行中に変化しないのであれば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);
  }
}
 …ところでこのSQLite、扱えるデータ型はINTEGER、REAL(FLOAT)、TEXT、BLOBの4種だけ。日付や時刻などは適宜TEXT(文字列)やINTEGER(整数)への置き換えを要します。

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • επιστημη(エピステーメー)

    C++に首まで浸かったプログラマ。 Microsoft MVP, Visual C++ (2004.01~2018.06) "だった"り わんくま同盟でたまにセッションスピーカやったり 中国茶淹れてにわか茶人を気取ってたり、 あと Facebook とか。 著書: - STL標準...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5