C++Builder: Blackfish SQLを使う
ガイド
目次
1 | 概要 | |
2 | Blackfish SQL とは | |
3 | DB の作成 | |
4 | DB の配布 | |
5 | 参考文献 |
履歴
editor | 唯野 |
2010.7.7 | 公開 |
2010.7.19 | 修正 |
2011.09.19 | 修正 |
2012.1.17 | タグ追加 |
2020.2.25 | 文字化け修正 |
概要
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を選択したらオブジェクトインスペクタで以下のプロパティをセットする。
Driver | BlackfishSQL (先にこれを選ぶ) |
ConnectionName | HogeBlackfishConnection (先ほど作成した接続名) |
LoginPrompt | False (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.exe | Blackfish SQL サーバ |
bsqlserver.exe.config | サーバ設定ファイル |
Borland.Data.Blackfish.LocalClient.dll | 接続に使う .netアセンブリ |
RAD Studio BlackfishSQL.slip | ライセンスファイル |
midas.dll | dbExpressアプリに必要 |
また、上記で作成された実際の 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 になってからの方が使いにくいし...