前回の記事の続き。
「Delphi2009でSQLiteを使う – 偏った言語信者の垂れ流し」が書かれた後に、本家の方がUnicodeに対応したバージョンを公開していた。
今回は、本家の方のライブラリを使ってみる。
- A simple Delphi wrapper for Sqlite 3 « Tim Anderson’s ITWritingからユニコード対応版のファイルをダウンロードして、展開します。
-
SQLiteTable3.pasのエディタで開き、修正します。
//property EOF: boolean read GetEOF; property Eof: boolean read GetEOF;
大文字のEOFを、頭文字だけ大文字に修正します。
この修正は、「stdio.h」の「#define EOF (-1)」によって、コンパイルエラーが発生することがある問題を回避するためのものです。 -
インポートライブラリを作成します。
「sqlite3.dll」がある場所で、次のコマンドを実行します。
"C:\Program Files\Embarcadero\RAD Studio\8.0\bin\implib.exe" sqlite3_.lib sqlite3.dll
「sqlite3.dll」から「sqlite3_.lib」を作成します。
libファイルのファイル名に「_」を加えたのは、「SQLite3.pas」と名前がかぶるためです。 -
C++Builder XEのプロジェクトを作成し、プロジェクトに「SQLite3.pas」「SQLiteTable3.pas」「sqlite3_.lib」を追加します。
プロジェクトを再構築すると、「SQLite3.hpp」「SQLiteTable3.hpp」が作成されます。
サンプルコードです。(前回のコードと同じ)
#include <tchar.h>
#include <locale>
#include <iostream>
#include <memory>
#include <stdio.h>
#include <boost/format.hpp>
#include "SQLiteTable3.hpp"
//---------------------------------------------------------------------------
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
std::locale::global(std::locale("japanese"));
try {
std::unique_ptr<TSQLiteDatabase> db(new TSQLiteDatabase("test.db"));
db->ExecSQL("CREATE TABLE test (name VARCHAR(20), val INTEGER);");
db->ExecSQL("INSERT INTO test (name,val) VALUES (\"あいうえお\",555);");
db->ExecSQL("INSERT INTO test (name,val) VALUES (\"かきくけこ\",666);");
db->ExecSQL("INSERT INTO test (name,val) VALUES (\"さしすせそ\",777);");
std::unique_ptr<TSQLiteTable> table(db->GetTable("SELECT name,val FROM test"));
boost::wformat fmter(L"name: %s, val: %d");
while (true)
{
if (table->Eof) break;
UnicodeString name = table->FieldAsString(table->FieldIndex["name"]);
int val = table->FieldAsInteger(table->FieldIndex["val"]);
std::wcout << fmter % name.c_str() % val << std::endl;
table->Next();
}
} catch (Exception &E) {
std::wcout << boost::wformat(L"error: %s") % E.Message.c_str() << std::endl;
}
return 0;
}
実行結果
name: あいうえお, val: 555
name: かきくけこ, val: 666
name: さしすせそ, val: 777
テストコード(uTestSqlite.pas)を見ると、日本語のテストコードも記述されていた。
日本語も安心して使えそうだ。
sSQL := 'INSERT INTO testtable(Name,OtherID,Number,Notes) VALUES ("何かの名前",4,587.6594,"日本語でもokです");';
Pingback: C++Builder XEでDelphi用SQLiteライブラリを使う。その3(PrepareSQLその1) « 山本隆の開発日誌
Pingback: C++Builder XEでDelphi用SQLiteライブラリを使う。その4(PrepareSQLその2) « 山本隆の開発日誌
Pingback: C++Builder XEでDelphi用SQLiteライブラリを使う。まとめ « 山本隆の開発日誌