今更ながら BDE (Borland Database Engine)
未だに使われる事もあります。正直な話、
- 最新バージョンは Delphi6から 付属してる 5.2 だけど...?
- Paradox/dBASE のデータベースアプリを新規に作る事ってあるの?
- 組み込みなら、BlackFishSQL や Firebird (Embedded) があるじゃない?
- 4.x と 5.x のBDE が混在したらどうするの?
- エリアスが重複したらどうするの?
- 配布が面倒じゃない?
- マルチコア/マルチプロセッサのPCでエラーになる事があるけどいいの?
と、業務アプリプログラミングが本業の私が言ってみます。
新規案件で BDE を使うのは流石にどうかと思うのですが、古いPCからのデータ移行で Paradox/xBASE を扱う場合には BDE を使うのが手っ取り早いのも事実です。業務で使われている MS-DOS マシンには xBASE のデータがゴロゴロしてたりしますね(Btrieveもありますけどね)。
あ、xBASE というのは、dBASE またはその互換アプリケーション の事です。昔は "Quick Silver" なんていう dBASE 互換アプリケーションがあったんですよ。Microsoft も xBASE 製品を出してまして、"FoxPro/Visual FoxPro" ってのがあります。日本では発売されなかったようですけどね。他の xBASE 製品には "dBXL" とか "ARAGO for Windows" なんてのがあります。
BDE の概要
BDE は、
- dBASE
- Paradox
- Microsoft Access
- FoxPro
- ASCII
のデータベースを特殊なドライバなしでアクセスできます。
- InterBase
- Microsoft SQL SERVER
- ORACLE
- SYBASE
- INFORMIX
- DB2
これらのデータベースは "SQL Link" と呼ばれるドライバを介してアクセスします。BDE に ODBC を接続して各種データベースにアクセスする事も可能です。
BDE の情報(公式)
"CodeGear Delphi 2009 および C++Builder 2009 のリリース ノート" にも書いてありますが、Vista 環境下ではデータベースファイルをドライブルート直下("C:\"等)に配置してはいけません。
BDE / SQL Link の配布
BDE / SQL Link は Borland 製品で作成されたアプリケーションと共に配布可能です。詳しい内容は BDE のインストールフォルダにある、"bdedeploy.txt" をお読み下さい。
ここからが本トピックの主題です。問題は "どうやって配布するのか?" です。
BDE の単体配布
これは明らかにライセンス違反です。ですが、この方法を知らない事にはインストーラ/インストールプログラムを作る事ができません。
- 既存の BDE フォルダから BDE 単体配布用パッケージを得る。
- "%ProgramFiles%\Common Files\Borland Shared\BDE\" を適当な場所にコピーする("BDE_TEMP"とか)。
- コピーしたフォルダから、"IDAPI.CFG" を削除。
- コピーしたフォルダにある "bdeinst.cab" を解凍し、"bdeinst.dll" を得る。
- これを BDE をインストールしたい PC へコピー。
- コピーしたフォルダで "regsvr32 bdeinst.dll" を実行。
- アンインストールするには、コピーしたフォルダで "regsvr32 /u bdeinst.dll" を実行し、"%ProgramFiles%\Common Files\Borland Shared\BDE\" を削除。
- "BDE マージモジュール" を使う。
- "BDE マージモジュール" を BDE をインストールしたい PC へコピー。
(Delphi 2009 の場合、"BDE マージモジュール" は インストールDVDの "Info\BDEMergeModule\jp" にあります)
- コピーしたフォルダで "msiexec /i BDE_???.msm" を実行。
- アンインストールするには、コピーしたフォルダで "msiexec /x BDE_???.msm" を実行。
BDE をインストーラに含める
各製品のマニュアルを参照して下さい(^^; 既に単体配布の方法が判っているのですから、どんなインストーラでも BDE を含める事は可能です。BDE を配布するなら、エリアスを作れる InstallShield が一番簡単です。他のインストーラではエリアスの作成が面倒です。
エリアスをアプリケーション内で設定する
エリアスをアプリケーションから設定してしまうというテもあります。この方法なら、インストーラでエリアスを設定する手間が必要ありません。データベースが Paradox/dBASE/ASCII ならエリアスの作成は非常に簡単です。
uses
..., DBTables;
procedure AddStdAlias(Alias, Driver, Path: String);
begin
if not Session.IsAlias(Alias) then
begin
Session.AddStandardAlias(Alias, Path, Driver);
Session.SaveConfigFile;
end;
end;
|
この関数を利用して、
procedure TForm1.FormShow(Sender: TObject);
begin
OnShow := nil;
AddStdAlias('TEST_PARADOX', 'PARADOX', IncludeTarilingPathDelimiter(ExtractFilePath(ParamStr(0))) + 'DATA');
end;
|
こんな感じで使います。例では Paradox のエリアス "TEST_PARADOX" を作り、パスを "<EXEの存在するフォルダ>\DATA" に設定しています。AddStdAlias() の第2引数(Driver)に利用できる文字列は、
のいずれかです。その他のドライバを使う場合はパラメータを指定しなくてはならないので少々面倒です。
uses
..., DBTables;
procedure AddSqlAlias(Alias, Driver: String; List: TStrings);
begin
if not Session.IsAlias(Alias) then
begin
Session.AddAlias(Alias, Driver, List);
Session.SaveConfigFile;
end;
end;
|
この関数を利用して、
procedure TForm1.FormShow(Sender: TObject);
const
DriverName = 'INTRBASE';
var
Params: TStringList;
begin
OnShow := nil;
Params := TStringList.Create;
try
Session.GetDriverParams(DriverName, Params);
Params.Values['USER NAME' ] := 'SYSDBA';
Params.Values['SERVER NAME'] := IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) + 'DATA\data.fdb';
AddSqlAlias('TEST_Interbase', DriverName, Params);
finally
Params.Free;
end;
end;
|
こんな感じで使います。例では Interbase のエリアス "TEST_Interbase" を作り、"SERVER NAME"パラメータ を "<EXEの存在するフォルダ>\DATA\data.fdb" に設定しています。第2引数(Driver)に利用できる文字列や、第3引数(List)に格納できるパラメータ及びパラメータの値は "BDE Administrator" で確認して下さい。
トラブルシューティング
- エラー $2A04
"マルチプロセッサマシン上で BDEを使用する (CDN)" をお読みください。
- エラー $3E06
"SQL Link"ドライバDLL が正しくコピーされていないか、BDE が正しくセットアップされていません。ファイルが揃っているのなら "BDE の単体配布" の項目を参考にして、"regsvr32 bdeinst.dll" を実行してみて下さい。
おまけ
Btrieve の話をしてしまったので、補足。
Btrieve は、現在 "Pervasive.SQL / Pervasive PSQL / PSQL SUMMIT" と名を変えています。純粋な Btrieve とはもはや別物の感がありますが、"Pervasive.SQL / Pervasive PSQL / PSQL SUMMIT" では Btrieve を扱うことができまして、Delphi からは ActiveX 経由で "Pervasive.SQL / Pervasive PSQL / PSQL SUMMIT" を操作できます。詳しくは、"Pervasive.SQL を Delphi で使用 (PERVASIVE)" を参照して下さい。