SQLiteはデータベースです。データベースというと一般的にはサーバですが、SQLiteはただのライブラリでアプリケーションに組み込んで使えます。SQLiteのソースコードはamalgamationされている状態で提供されています。amalgamationとは、全部のソースコードを1つのファイルにまとめることのようです。amalgamationで提供されるファイルは、Cのソースファイルが1つとヘッダ2つだけしかありませんので簡単に既存のプロジェクトに組み入れることができます。
ここではVisual C++ ver 6でダイアログベースのアプリケーションを作成して、SQLiteを組み込んでみます。
DBを作成する
最初にデータベースを作成します。SQLiteのダウンロードページからPrecompiled Binaries For Windowsの中のコマンドラインツールをダウンロードして解凍します。ここではhsqlite-3_6_6_2.zipをダウンロードしました。sqlite3.exeというファイルが解凍されるので、これを以下のようにコマンドラインから起動して、データベースを作成します。
1 2 3 4 5 6 7 8 9 10 11 |
C:\sqlite>sqlite3.exe testdb.db SQLite version 3.6.6.2 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> create table testtable ( id int not null, val varchar(255) null ); sqlite> insert into testtable ( id, val ) values ( '1', 'aaa' ); sqlite> select * from testtable; 1|aaa sqlite> .quit C:\sqlite> |
これでtestdb.dbというファイルができます。
AppWizardでダイアログベースアプリを作成
VC6でプロジェクトを作成します。
SQLiteのamalgamationソースコードを組み込む
SQLiteのダウンロードページからamalgamationのソースコードをダウンロード、ここではsqlite-amalgamation-3_6_6_2.zipをダウンロードしました。
ダウンロードしたファイルを解凍して中の3つのファイル,sqlite3.c,sqlite3.h,sqlite3ext.hをプロジェクトフォルダにコピーしてから、VC6で[プロジェクト][プロジェクトへ追加][ファイル]を選択して、これらのファイルを追加します。
sqlite3.cがプリコンパイルを使用しないようにプロジェクトの設定を変更します。
ビルドして、エラーにならないか確認します。ウォーニングはいっぱい出ます。
コーディングする
ダイアログにボタンを追加して、ハンドラを追加してコードを書きます。最初にヘッダファイルをインクルードします。
1 |
#include "sqlite3.h" |
つぎにハンドラにコードを書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
static int callback(void *pString, int argc, char **argv, char **azColName) { CString* pResult = (CString*)pString; for(int i=0; i<argc; i++) { CString strT; strT.Format("%s = %s\r\n", azColName[i], argv[i] ? argv[i] : "NULL"); (*pResult) += strT; } return 0; } void CSstDlg::OnButton1() { sqlite3* pDB = NULL; CString strResult; char* pErr = NULL; if ( SQLITE_OK != sqlite3_open("C:\\sqlite\\testdb.db", &pDB) ) { AfxMessageBox("ERROR"); goto Error_; } if ( SQLITE_OK != sqlite3_exec(pDB, "select * from testtable", callback, &strResult, &pErr) ) { AfxMessageBox(pErr); goto Error_; } MessageBox(strResult); Error_: if ( pErr ) sqlite3_free(pErr); if ( pDB ) sqlite3_close(pDB); } |
sqlite3_open()などに渡す文字列はUTF8で渡さなければなりませんので日本語が含まれる場合は、注意する必要があります。UTF16で渡すことができるバージョンの関数もあります。