ADO (dbGo) で ODBC ドライバを使って dBASE / Paradox ファイルを開く
BDE を使わずに ADO (dbGo) で dBASE / Paradox ファイルに ODBC 接続する方法です。
dBASE の場合
uses
..., DB, ADODB;
var
ADOC: TADOConnection;
ADOQ: TADOQuery;
ConnnectionParam, ExtPropParam: TStringList;
ConStr, ExtProps, DatabasePath: string;
begin
// データベースパス
DatabasePath := 'C:\Program Files\Common Files\Borland Shared\Data';
// dbGo の設定
ADOC := TADOConnection.Create(nil);
ADOQ := TADOQuery.Create(nil);
ConnnectionParam := TstringList.Create;
ExtPropParam := TstringList.Create;
try
// コネクション文字列の生成 (追加プロパティ)
with ExtPropParam do
begin
Values['DBQ' ] := DatabasePath; // データベースパス
Values['DefaultDir' ] := DatabasePath; // デフォルトパス
Values['FIL' ] := 'dBASE III'; // or 'dBASE IV' or 'dBASE 5.0'
end;
ExtProps := StringReplace(ExtPropParam.Text, #$0D#$0A, ';', [rfReplaceAll]);
// コネクション文字列の生成
with ConnnectionParam do
begin
Values['Provider' ] := 'MSDASQL'; // OLE DB
Values['Driver' ] := '{Microsoft dBase Driver (*.dbf)}'; // ドライバ名 (dBASE)
Values['Extended Properties'] := Format('"%s"', [ExtProps]); // 追加プロパティ
end;
ConStr := StringReplace(ConnnectionParam.Text, #$0D#$0A, ';', [rfReplaceAll]);
ADOC.LoginPrompt := False;
ADOC.ConnectionString := ConStr;
ADOQ.Connection := ADOC;
// 接続
ADOC.Connected := True;
// クエリ発行
with ADOQ do
begin
SQL.Clear;
SQL.Add('Select * From ANIMALS.DBF'); // テーブル名 = ファイル名
Open;
while not EOF do
begin
ShowMessage(FieldByName('NAME').AsString);
Next;
end;
Close;
end;
// 切断
ADOC.Connected := False;
finally
ExtPropParam.Free;
ConnnectionParam.Free;
ADOQ.Free;
ADOC.Free;
end;
end;
|
コンポーネントをポトリペタリしない手法ですので、何らかのユニットにまとめておいてもいいかもしれませんね。
Paradox の場合
uses
..., DB, ADODB;
var
ADOC: TADOConnection;
ADOQ: TADOQuery;
ConnnectionParam, ExtPropParam: TStringList;
ConStr, ExtProps, DatabasePath: string;
begin
// データベースパス
DatabasePath := 'C:\Program Files\Common Files\Borland Shared\Data';
// dbGo の設定
ADOC := TADOConnection.Create(nil);
ADOQ := TADOQuery.Create(nil);
ConnnectionParam := TstringList.Create;
ExtPropParam := TstringList.Create;
try
// コネクション文字列の生成 (追加プロパティ)
with ExtPropParam do
begin
Values['DBQ' ] := DatabasePath; // データベースパス
Values['DefaultDir' ] := DatabasePath; // デフォルトパス
Values['FIL' ] := 'Paradox 3.X'; // or 'Paradox 4.X' or 'Paradox 5.X'
end;
ExtProps := StringReplace(ExtPropParam.Text, #$0D#$0A, ';', [rfReplaceAll]);
// コネクション文字列の生成
with ConnnectionParam do
begin
Values['Provider' ] := 'MSDASQL'; // OLE DB
Values['Driver' ] := '{Microsoft Paradox Driver (*.db )}'; // ドライバ名 (Paradox)
Values['Extended Properties'] := Format('"%s"', [ExtProps]); // 追加プロパティ
end;
ConStr := StringReplace(ConnnectionParam.Text, #$0D#$0A, ';', [rfReplaceAll]);
ADOC.LoginPrompt := False;
ADOC.ConnectionString := ConStr;
ADOQ.Connection := ADOC;
// 接続
ADOC.Connected := True;
// クエリ発行
with ADOQ do
begin
SQL.Clear;
SQL.Add('Select * From BIOLIFE.DB'); // テーブル名 = ファイル名
Open;
while not EOF do
begin
ShowMessage(FieldByName('Common_Name').AsString);
Next;
end;
Close;
end;
// 切断
ADOC.Connected := False;
finally
ExtPropParam.Free;
ConnnectionParam.Free;
ADOQ.Free;
ADOC.Free;
end;
end;
|
パラメータが dBASE とちょっと違うだけですね。
Jet 4.0 と BDE
ODBC 経由の接続の場合、規定の動作では BDE がインストールされていれば間接的に BDE が使われ、そうでなければ Microsoft の ISAM ドライバが使われます...つまり、BDE のインストールの有無によって挙動が異なる事になります。
Jet 4.0 は Service Pack 5 以降が適用されていない場合、dBASE / Paradox データベースファイルへのアクセスは読み取り専用となります。読み書きを可能にするためには BDE のインストールまたは Jet 4.0 Service Pack 5 以降のインストールが必要です。つまり、BDE と Jet 4.0 Service Pack の有無により、挙動の異なる 3 つの状態があるという事です。
ISAM (読み取り専用) |
間接 BDE (読み書き) |
ISAM (読み書き) |
Microsoft の ISAM ドライバには以下のような制限があります。
- ファイル名は 8.3 形式でなくてはならない
- ファイル名に特殊な文字が含まれる場合、SQL 等のテーブル指定の際に [] で括る必要がある
- テーブルにレコードを追加する前にプライマリインデックスを作成しなくてはならない。
- プライマリインデックスがテーブルに存在しない場合には空のテーブルでない限りテーブルを更新できない。
その PC で dBASE / Paradox を ODBC で接続するアプリケーションが複数存在しない場合にはレジストリを操作する事により挙動を一致させる事ができます。具体的には
- HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0\Engines\Xbase (WOW64 の場合には HKEY_LOCAL_MACHINE\Software\WOW6432Node\Microsoft\Jet\4.0\Engines\Xbase)
- HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0\Engines\Paradox (WOW64 の場合には HKEY_LOCAL_MACHINE\Software\WOW6432Node\Microsoft\Jet\4.0\Engines\Paradox)
に BDE というキーを DWORD 値で作り、値を指定します。
- 0 - BDE がインストールされている場合、BDE を使用します。インストールされていない場合は、Microsoft ISAM を使用します。
- 1 - 常に BDE を使用します。BDE がインストールされていない場合は、エラーとなります。
- 2 - 常に Microsoft ISAM を使用します。
他に dBASE / Paradox を ODBC で接続するアプリケーションがインストールされる可能性があるのであれば、この手法を採るべきではありません。BDE 経由でも Microsoft ISAM でも同じ動作になるようにコードやデータベースファイル名を修正すべきです。
BDE の排除が目的なのであれば、Jet 4.0 Service Pack 5 以降の更新プログラムのインストールが必須となります。読み取りだけでいいのであればこの限りではありません。
注意点
Delphi 2010 だと IDE からの実行の場合、二回目の実行でアプリケーションが動作を停止してしまいます。少なくとも ANSI 版 Delphi や XE 以降ではこの現象は発生しません。QC#78935 に類似する問題のようです。
See Also: