C++Builder XEでDelphi用SQLiteライブラリを使う。その2

前回の記事の続き。

Delphi2009でSQLiteを使う – 偏った言語信者の垂れ流し」が書かれた後に、本家の方がUnicodeに対応したバージョンを公開していた。
今回は、本家の方のライブラリを使ってみる。

  1. A simple Delphi wrapper for Sqlite 3 « Tim Anderson’s ITWritingからユニコード対応版のファイルをダウンロードして、展開します。

  2. SQLiteTable3.pasのエディタで開き、修正します。

    //property EOF: boolean read GetEOF;
    property Eof: boolean read GetEOF;
    

    大文字のEOFを、頭文字だけ大文字に修正します。
    この修正は、「stdio.h」の「#define EOF (-1)」によって、コンパイルエラーが発生することがある問題を回避するためのものです。

  3. インポートライブラリを作成します。

    「sqlite3.dll」がある場所で、次のコマンドを実行します。

    "C:\Program Files\Embarcadero\RAD Studio\8.0\bin\implib.exe" sqlite3_.lib sqlite3.dll
    

    「sqlite3.dll」から「sqlite3_.lib」を作成します。
    libファイルのファイル名に「_」を加えたのは、「SQLite3.pas」と名前がかぶるためです。

  4. 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です");';

コメント

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

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

  3. Pingback: C++Builder XEでDelphi用SQLiteライブラリを使う。まとめ « 山本隆の開発日誌

コメントを残す

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

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