「A simple Delphi wrapper for Sqlite 3 « Tim Anderson’s ITWriting」でDelphi用SQLiteライブラリが公開されている。
このライブラリの導入方法と簡単な使い方を前回の記事(C++Builder XEでDelphi用SQLiteライブラリを使う。その2)で紹介した。
今回はこのライブラリを使ってPrepareSQLを使用する。
PrepareSQLは次の手順で実行する。
- TSQLiteDatabaseのPrepareSQLを使用して、TSQLiteQueryを作成する。
- TSQLiteQueryのBindSQLで値を設定する。
- ExecSQLで実行する。
- 2と3を繰り返す。
- 終わったらReleaseSQLでリソースを解放する。
サンプルプログラム
std::unique_ptr<TSQLiteDatabase> db(new TSQLiteDatabase("test.db"));
db->ExecSQL("CREATE TABLE test (name VARCHAR(20), val INTEGER);"); //テーブルを作成
//TSQLiteQueryを作成する
TSQLiteQuery query = db->PrepareSQL("INSERT INTO test (name,val) VALUES (?, ?);");
//クエリーを実行する
db->BindSQL(query, 1, L"あいうえお"); //パラメータは1から始まる
db->BindSQL(query, 2, 555); //2番目のパラメータの値を設定する
db->ExecSQL(query); //実行
//繰り返し
db->BindSQL(query, 1, L"かきくけこ");
db->BindSQL(query, 2, 666);
db->ExecSQL(query);
//リソースを解放する
db->ReleaseSQL(query);
なぜか文字化けが発生したので、ソースコードを修正した。
修正箇所1
function TSQLiteDatabase.PrepareSQL(const SQL: String): TSQLiteQuery;
var
Stmt: TSQLiteStmt;
NextSQLStatement: PChar;
begin
Result.SQL := SQL;
Result.Statement := nil;
// if Sqlite3_Prepare16(self.fDB, PChar(SQL), -1, Stmt, NextSQLStatement) <>
if Sqlite3_Prepare(self.fDB, PAnsiChar(UTF8String(SQL)), -1, Stmt, NextSQLStatement) <>
修正箇所2
procedure TSQLiteDatabase.BindSQL(Query: TSQLiteQuery; const Index: Integer; const Value: String);
begin
if Assigned(Query.Statement) then
Sqlite3_Bind_Text(Query.Statement, Index, PAnsiChar(UTF8String(Value)), -1, Pointer(SQLITE_STATIC))
// Sqlite3_Bind_Text16(Query.Statement, Index, PChar(Value), Length(Value) * SizeOf(char), Pointer(SQLITE_STATIC))
元のコードではUTF-16文字列を使用する関数を使っていたが、UTF-8文字列を使う関数を使用するように変更している。
なぜ元のコードで文字化けが発生したのかわからないが、この変更で問題なく動作しているようだ。
Pingback: C++Builder XEでDelphi用SQLiteライブラリを使う。その4(PrepareSQLその2) « 山本隆の開発日誌