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 つの状態があるという事です。

BDE なし BDE あり
Jet 4.0 SP5 なし ISAM
(読み取り専用)
間接 BDE
(読み書き)
Jet 4.0 SP5 あり ISAM
(読み書き)

Microsoft の ISAM ドライバには以下のような制限があります。

その PC で dBASE / Paradox を ODBC で接続するアプリケーションが複数存在しない場合にはレジストリを操作する事により挙動を一致させる事ができます。具体的には

に BDE というキーを DWORD 値で作り、値を指定します。

他に dBASE / Paradox を ODBC で接続するアプリケーションがインストールされる可能性があるのであれば、この手法を採るべきではありません。BDE 経由でも Microsoft ISAM でも同じ動作になるようにコードやデータベースファイル名を修正すべきです。

BDE の排除が目的なのであれば、Jet 4.0 Service Pack 5 以降の更新プログラムのインストールが必須となります。読み取りだけでいいのであればこの限りではありません。

注意点

Delphi 2010 だと IDE からの実行の場合、二回目の実行でアプリケーションが動作を停止してしまいます。少なくとも ANSI 版 Delphi や XE 以降ではこの現象は発生しません。QC#78935 に類似する問題のようです。

See Also:


 BACK