ホーム > 使った

C++Builder: Blackfish SQLを使う

概要

C++Builder から dbExpress で Blackfish SQL に接続し、作成したアプリケーションの配布するまでを概説する。プログラムを作成する上で、単純なデータは CSV なり INI なりプレーンテキストで保持してもよいのではあるが、DB に SQL でアクセスできた方が楽な場合も確かにある。そんなわけで、手軽に exe と一緒に配布できる組み込み型 DB には以前から関心があり、RAD Studio になって Blackfish が登場したということで試しに使ってみた。しかし、よく考えてみると Blackfish は .net アセンブリなので .net Framework が exe と別個にインストールされていないといけない。それなら MySQL をインストールするのと大して変わらないのでは――と思ってしまったので深くは試していないのだが、備忘録的にやったことを残しておこうと思う。

なお、当方の環境は Windows XP Professional SP3 + C++Builder 2009 Enterprise Update4 である。

Blackfish SQL とは

Blackfish SQL は CodeGear (旧 Borland)的にいうと、要は Paradox の後継となる DBMS である。元をたどると JDataStore という Java で書かれていたものを C# に移植したものとなっている。そのため Java や ADO.net からもアクセス可能で、Unicode にも対応といった辺りがポイントになっている。

C++Builder からは dbExpress で接続するドライバが提供されているが、現状、ローカルからは接続できずリモートでしか接続できない。つまり、あくまでも Blackfish SQL サーバを別プロセスで先に起動しておく必要がある。そのため exe と同じプロセスとして使えるわけではないが、代わりに他のクライアントとのデータの共有ができる。

DB の作成

配布に関しては後述するので、まずは何にせよアプリケーションで使う DB を作成する。C++Builder を起動したら [表示]-[データエクスプローラ] を選択し、画面右上パネルに表示されたデータエクスプローラから BLACKFISHSQL を右クリックして [新規接続の追加] をすると、ダイアログが表示されるので、プロバイダ名 : BLACKFISHSQL、接続名 : HogeBlackfishConnection (アプリケーションに合った名前)で [OK] する。

新規接続の追加

新規接続が作成されたら、今度はその上で右クリックして [接続の変更] を選び以下の値をセットする。

サーバー名localhost
データベース名hoge(アプリケーションに合った名前)
ユーザー名SYSDBA
パスワードmasterkey

接続の変更

セットしたら、[拡張...] をクリックして、create プロパティの値を [True] にして [OK] する。

拡張プロパティ

[接続の変更] ダイアログに戻り、[テスト接続] をクリックすると、DB に接続できたことが確認できるはずである。

テスト接続

そこで [接続の変更] ダイアログをいったん閉じる。そうしたら、アプリケーションに [ファイル]-[新規作成]-[その他...] で [C++Builderファイル] から [データモジュール] を選択してデータモジュールを追加する。そして、データモジュール上にコンポーネントパレットの [dbExpress] ページから TSQLConnection を選んで配置する。

TSQLConnectionの配置

配置したTSQLConnectionを選択したらオブジェクトインスペクタで以下のプロパティをセットする。

DriverBlackfishSQL (先にこれを選ぶ)
ConnectionNameHogeBlackfishConnection (先ほど作成した接続名)
LoginPromptFalse (True だと接続時にパスワードの入力が必要)

これで TSQLConnection の Connected プロパティを True にしても DB に接続できるはずである。

オブジェクトインスペクタ

また、DB に対してテーブルなどを追加したい場合は、データエクスプローラから該当 DB のテーブルなどを右クリックすることで編集できる。

データエクスプローラ

ここで後の配布時に配布先から接続が確認できるよう、メインフォームに以下のようなコードを追加して exe をビルドしておく。

#include "db.h"  // データモジュールのヘッダファイル

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    DataModule1->SQLConnection1->Connected = true;

    if(DataModule1->SQLConnection1->Connected)
    {
        ShowMessage("接続成功");
    }
    else
    {
        ShowMessage("接続失敗");
    }
}

dbExpress での接続さえできれば、後は接続先の DB が違うだけで TSimpleDataSet といったコンポーネントを使う分には他の dbExpress アプリケーションの場合と同じである。そういう透過性を実現しているのが dbExpress のメリットになるからだ。

DB の配布

まず、上述した IDE からの接続でプレースホルダとして使用した BLACKFISHSQL という接続は dbxdrivers.ini という ini ファイルに実体がある。これは C:\Documents and Settings 以下(C++Builder を All User でインストールしたかどうかでパスが違う)にあるが、具体的に抜粋すると以下の内容になっている。(参考までに作成された HogeBlackfishConnection の実体は dbxconnections.ini にある。このふたつの ini ファイルに dbExpress の接続設定が保存されている。)

[BlackfishSQL]
DriverUnit=DBXBlackfishSQL
DriverPackageLoader=TDBXClientDriverLoader,DBXClientDriver120.bpl
DriverAssemblyLoader=Borland.Data.TDBXClientDriverLoader,Borland.Data.DbxClientDriver,(実際は一行)
Version=12.0.0.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
MetaDataPackageLoader=TDBXDataStoreMetaDataCommandFactory,DbxClientDriver120.bpl
MetaDataAssemblyLoader=Borland.Data.TDBXDataStoreMetaDataCommandFactory,(実際は一行)
Borland.Data.DbxClientDriver,Version=12.0.0.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
Password=masterkey
User_Name=sysdba
Port=2508
Create=False
ReadOnlyDb=False

dbExpress では接続時のスケーラビリティを確保するために、接続時のパラメータをこの ini ファイルからも読み込めるようになっており、それを指示するのが TSQLConnection の LoadParamsOnConnect プロパティである。もっというと TSQLConnection の Driver プロパティや ConnectionName プロパティは、この ini ファイルの設定を指しているわけなので、接続は ini ファイルを編集して追加することもできる。ただ、今回の主旨のような単純なデータの保持で、接続先が実行時に可変になる(ini ファイルのエントリを切り替える)ということはあまりないと思うので、通常このプロパティは False でよい。

とはいえ、dbxdrivers.ini を参照しない以上、配布するアプリでは上述の ini ファイルの内容を TSQLConnection の Params プロパティとしてアプリ側で保持しておく必要がある。つまり、元々の Params プロパティにない Password より上の行の内容を追加しておかなければならない。([エディタ...] でコピー & ペーストすればいい。)

値リストの編集

次にアプリケーションとともに配布時に必要となる以下のファイルをアプリケーションの exe とともに同じディレクトリ(もしくはパスの通ったディレクトリ)にコピーする。いずれも C:\Program Files\CodeGear\RAD Studio か C:\Program Files\Common Files\CodeGear Shared か C:\Windows\System32 以下を検索すればある。

bsqlserver.exeBlackfish SQL サーバ
bsqlserver.exe.configサーバ設定ファイル
Borland.Data.Blackfish.LocalClient.dll接続に使う .netアセンブリ
RAD Studio BlackfishSQL.slipライセンスファイル
midas.dlldbExpressアプリに必要

また、上記で作成された実際の DB ファイル(hoge.JDS)は C:\Windows\System32 にあるので、hoge_LOGA_0000000000、hoge_LOGA_ANCHOR (これらはロックファイル)とともに、同じく exe と同じ場所へ移動させておく。(C++Builder のパッケージが実行時の参照なら、それらも必要。これはプロジェクトのオプション次第なのでここでは省く。)

ファイルの移動

つまり配布先には上の画像にあるファイルが少なくとも必要になる。後は事前に .net Framework 2.0 Runtime のインストールされた配布先 PC に、これらをコピーして Blackfish SQL サーバを起動後、クライアントアプリを起動すればいい。(ここでは VMware 上の Windows 2000 にコピーしている。ちなみに Windows 2000 では .net Framework のインストールの前に Windows Installer 3.0 も必要だった。)サーバを単純に起動するだけならコマンドラインから bsqlserver.exe を起動させるだけでよい。(Ctrl+C で終了。)

サーバの起動

但し、毎回サーバを手動で起動させるのは面倒なので、コマンドラインから「bsqlserver -install」すると、サーバをサービスとしてインストールさせることができる。

サーバをサービスとしてインストール

さっそくマシンを再起動させてサービスマネージャを見るとサーバの動いているのが分かる。

サービス

最後に、クライアントの exe を起動して動作確認すると DB に接続できるはずである。

接続成功

dbExpress は IDE と DB (Oracle、MySQL etc)の間に CodeGear が共通のドライバを用意することで IDE から見た DB による違いを吸収する優れたアーキテクチャだと思う。惜しむらくは、そのメリットをきちんと説明したドキュメントの少ないことだろうか... ヘルプも RadStudio になってからの方が使いにくいし...

参考文献