SQLiteは、フリーソフトとして公開されているファイルベースのデータベースです。Webプログラミングの世界でも、PHP5に標準で入るようになって気軽に使えるようになって来ました。
このSQLiteは、ソースやdll版が公開されているので、自由に自分のプログラムに組み込むことができます。特別なインストールや設定も不要で、データベースのファイルを作成したり開いたら、後はSQLのコマンドでテーブルを作成したりデータを格納し、またデータを検索することが可能。大掛かりなデータベースシステムというより、ファイルをSQLのインターフェースで簡単にデータベースとして扱えるファイル処理用ライブラリ、といった感じですね。
今回は、SQLiteのdllをVC++から使ってみましょう。
まず、公式サイトのダウンロードページからWindows用のsqlite3.dllとソースファイルをダウンロードします。続いて、VC++でWindowsプログラムのプロジェクトを作成し、dll本体とソースの中にあるヘッダ(*.h)をプロジェクトのディレクトリにコピーしましょう。これで、sqlite3.hをインクルードすればsqlite3.dllを使用できるようになるはずです。
dllを使用するには、まずdllの関数を参照するためのポインタを用意します。最初に
// sqlite3.dll内関数ポインタ型定義
typedef int (__cdecl * pOpen)(char *, sqlite3 **);
typedef int (__cdecl * pExec)(sqlite3 *, const char *, sqlite3_callback, void *, char **);
typedef int (__cdecl * pGetTable)(sqlite3 *, const char *, char ***, int *, int *, char **);
typedef int (__cdecl * pFreeTable)(char **);
typedef int (__cdecl * pClose)(sqlite3 *);
といった感じでポインタの型を定義し、続いてポインタ変数を用意しましょう。この変数名は、dll内の関数にあわせておくとわかりやすいでしょう。
// 関数ポインタ変数
pOpen sqlite3_open;
pExec sqlite3_exec;
pGetTable sqlite3_get_table;
pFreeTable sqlite3_free_table;
pClose sqlite3_close;
関数ポインタを用意したら、dllを読み込んでdll内の関数のポインタを取得していきます。
// sqlite3.dllをロード
hDll = LoadLibrary("sqlite3");
// sqlite3関数のアドレスを取得
sqlite3_open = (pOpen)GetProcAddress(hDll, "sqlite3_open");
sqlite3_exec = (pExec)GetProcAddress(hDll, "sqlite3_exec");
sqlite3_get_table = (pGetTable)GetProcAddress(hDll, "sqlite3_get_table");
sqlite3_free_table = (pFreeTable)GetProcAddress(hDll, "sqlite3_free_table");
sqlite3_close = (pClose)GetProcAddress(hDll, "sqlite3_close");
以上で、sqlite3の関数を使用できるようになりました。さっそく、データベースファイルを作成し、テーブルを作ってデータを入れてみましょう。
sqlite3 *db;
char *err;
// データベースファイルを作成
sqlite3_open("test.db", &db);
// テーブル作成
sqlite3_exec(db, "create table test(num integer,name string);", NULL, NULL, &err);
// データを格納
sqlite3_exec(db, "insert into test values(1,'test1');", NULL, NULL, &err);
// データベースファイルを閉じる
sqlite3_close(db);
データベースファイルを開いてテーブル作成やデータ格納を行う流れは、以上のようになります。この段階で、test.dbというバイナリファイルが作成されるはずですので、確かめてみてください。
次に作成したデータベースファイルからデータを取得してみます。データの取得も、ファイルを開いてSQLを発行していくのですが、sqlite3_get_table()を使用するとデータをまとめて持ってこれるので便利でしょう(sqlite3_exec()だとデータを取り込むコールバック関数が必要になる)。
// データベースファイルを開く
sqlite3_open("test.db", &db);
// テーブルからデータを取得
sqlite3_get_table(db, "select * from test;", &result, &row, &col, &err);
// 取得したデータを表示
printf("%s-%s\n", result[2], result[3]);
// データ領域を解放
sqlite3_free_table(result);
// データベースファイルを閉じる
sqlite3_close(db);
プログラムソース表示
今回はdllを使いましたが、単独の実行ファイルにまとめる場合はVC++用の静的ライブラリを使うこともできます。
|