SQLiteをC++から呼び出す(1:テーブル作成)

前回までの準備で必要なファイルはひととおり揃っているはずなので、テストプログラムを作成した上で、まずはテーブルを作成する

テストプログラムとして、VisualStudio(2008)でMFCアプリケーションを作成する。今回はSDIで「SQLiteTest」というプログラムにしておく。ウィザードの指定項目は適当でよい(はず)。
プロジェクト作成後に念のため「SQLiteTest」プロジェクトのプロパティ→構成プロパティ→全般→文字セットが、「Unicode文字セットを使用する」になっていることを確認する。

次に「sqlite3.lib」と「sqlite3.h」をコピーする。面倒なので今回はプロジェクトの直下にコピーしておく。ついでに「sqlite3.dll」もSQLiteTest.exeと同じ階層にコピーしておく。

今回実行するのはテーブルの作成なので、それらしい名前を付けたメニューを作成して、そのハンドラをMainFrameに作成する。ついでにMainFrame.cppで「sqlite3.h」をインクルードしておく。

作成したテーブル作成のハンドラは次のような感じになった。(エラー処理はテキトー)

void CMainFrame::OnCreateTable()
{
	sqlite3* db;
	int err;
	_TCHAR* db_name = _T("c:\\SQLiteDB\\testDB.db");


	// データベースを開く
	err = sqlite3_open16(db_name, &db);

	if (err != SQLITE_OK)
	{
		AfxMessageBox( _T("openErr") ) ;
		return ;
	}

	//テーブルを作成する
	CString strSQL = _T("CREATE TABLE [TEST_TABLE] ([ID] INTEGER PRIMARY KEY AUTOINCREMENT, [DISP_ID] VARCHAR(30), [NAME] VARCHAR(50) NOT NULL,[COMMENT] TEXT,[REGIST_TIME] DATETIME NOT NULL,[UPDATE_TIME] DATETIME NOT NULL);") ;

	CStringA strSQL_A ;
	strSQL_A = strSQL ;

	err = sqlite3_exec(db, strSQL_A, NULL, 0, 0);

	if (err != SQLITE_OK)
	{
		AfxMessageBox( _T("CreateErr") ) ;
		return ;
	}

	sqlite3_close(db);
}

あくまで文字はUNICODEという前提のプログラムなので、
DBのオープン(この場合は作成でもあるけど)は、

  • sqlite3_open16

を使用する。次にテーブルを作成するSQL文を実行するのだが、SQL文を実行する、

  • sqlite3_exec

には「sqlite3_exec16」のようなUNICODE対応版は存在しない。理由は「sqlite3_exec」自体をレガシー扱いとするためらしい。仕方がないので、ここではUNICODEで作成した文字列をマルチバイト文字に変換した上で「sqlite3_exec」に渡している。

このハンドラを実行すると"c:\SQLiteDBフォルダの中に「testDB.db」ファイルが作成される。SQLiteの場合このファイルがデータベースファイルということになる。バックアップしたけりゃこのファイルをどこかにコピーという感じ。

テーブルが作成されているかどうか確認する方法はいろいろあると思うけど、私はヘタレなので、「PupSQLite」というアプリを使用している。

PupSQLite作者さんのページ

PupSQLiteで作成した「testDB.db」を開いてみるとこんな感じ。

テーブルが作成てきていることが確認できる

※おかしな点はツッコんでください。
(つづく)

BIRTHDAY(期間生産限定盤)(DVD付)

BIRTHDAY(期間生産限定盤)(DVD付)