🐡

C++Builder11.3でFirebird Embedded 4.0 を使用する

2023/08/11に公開

Firebird Embeddedとは

Firebirdのデータベースエンジンをユーザアプリケーションに組み込む仕組み。Firebird2.5の時は専用インストーラが存在したが、3.0以降では1つに統合されている。Firebird3.0や4.0では配置するファイルが10個程度ある。SQLITEとほぼ同等ではあるが、Firebirdの方が一般的なDBユースに近く、同時書き込みにも対応しているため厳密な管理が必要な場合はこちらを採用したい。

必要なファイル

配置するファイルは複数あるため、忘れないようにすること。
ここではFirebrid 4.0 Embeddedについて記載する。
公式ではインストーラ以外にZIP版もあるため、こちらをダウンロードしてくるとよい。
https://firebirdsql.org

以下が必要なファイルである。これらをユーザアプリケーションのフォルダに配置する。

No Firebird
1 intl\fbintl.conf
2 intl\fbintl.dll
3 plugins\engine13.dll
4 firebird.conf
5 icudt63l.dat
6 fbclient.dll
7 ib_util.dll
8 icudt63.dll
9 icuin63.dll
10 icuuc63.dll
11 msvcp140.dll
12 vcruntime140.dll
13 firebird.msg

また、公式マニュアルも参考にされたし。
https://ib-aid.com/download/docs/fb4migrationguide.html#_installing_embedded

サンプルコード

void __fastcall TForm4::Button2Click(TObject *Sender)
{
	TFDConnection *connection = new TFDConnection(NULL);
	connection->DriverName = "FB";
	connection->Params->Database = GetCurrentDir() + "\\MyDb.fdb";

	TFDQuery *query = new TFDQuery(NULL);
	query->Connection = connection;

        // CREATE DATABASEはFDScriptから実行(FDQeuryでは実行できない)
	TFDScript *script = new TFDScript(NULL);
	script->Connection = connection;
	script->SQLScripts->Add();
	script->SQLScripts->Items[0]->SQL->Text = "CREATE DATABASE 'MyDb.fdb' USER 'SYSDBA' PASSWORD 'masterkey';";
	
	// Firebirdのfbclinet.dllのファイルの場所を指定
	TFDPhysFBDriverLink *link = new TFDPhysFBDriverLink(connection);
	link->Embedded = true;
	link->ThreadSafe = true;
	link->VendorLib = GetCurrentDir() + "\\FB40\\fbclient.dll";

	script->ExecuteAll(); // CREATE DATABASE

	// テーブル定義
	query->SQL->Clear();
	query->SQL->Text = "CREATE TABLE MyTable(id integer, name VARCHAR(16), PRIMARY KEY(id))";
	query->ExecSQL();

	// テストデータ投入
	query->SQL->Clear();
	query->SQL->Text = "INSERT INTO MyTable(id, name) VALUES (1,'namae');";
	query->ExecSQL();

	// クエリ
	query->SQL->Clear();
	query->SQL->Text = "SELECT * FROM MyTable;";
	query->Open();
	int count = query->RecordCount;	// count = 1になる
        connection->Close();

        delete link;
	delete connection;
	delete query;
}

Discussion