C++Builder XEでDelphi用SQLiteライブラリを使う。その3(PrepareSQLその1)

A simple Delphi wrapper for Sqlite 3 « Tim Anderson’s ITWriting」でDelphi用SQLiteライブラリが公開されている。

このライブラリの導入方法と簡単な使い方を前回の記事(C++Builder XEでDelphi用SQLiteライブラリを使う。その2)で紹介した。

今回はこのライブラリを使ってPrepareSQLを使用する。

PrepareSQLは次の手順で実行する。

  1. TSQLiteDatabaseのPrepareSQLを使用して、TSQLiteQueryを作成する。
  2. TSQLiteQueryのBindSQLで値を設定する。
  3. ExecSQLで実行する。
  4. 2と3を繰り返す。
  5. 終わったら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文字列を使う関数を使用するように変更している。

なぜ元のコードで文字化けが発生したのかわからないが、この変更で問題なく動作しているようだ。

コメント

  1. Pingback: C++Builder XEでDelphi用SQLiteライブラリを使う。その4(PrepareSQLその2) « 山本隆の開発日誌

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください