SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

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

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


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(整数)への置き換えを要します。

次のページ
結果の取得とUnicode

この記事は参考になりましたか?

特集記事連載記事一覧

もっと読む

この記事の著者

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

C++に首まで浸かったプログラマ。Microsoft MVP, Visual C++ (2004.01~2018.06) "だった"りわんくま同盟でたまにセッションスピーカやったり中国茶淹れてにわか茶...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2414 2008/05/22 09:04

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー