データベースsqlite3.dllをVC++から使う

高機能データベースSQLiteを自作プログラムに組み込む

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++用の静的ライブラリを使うこともできます。


トップ 戻る