BDE アプリケーションの移行(FireDAC)

提供: RAD Studio
移動先: 案内検索

FireDAC への BDE アプリケーションの移行 への移動


この例では、従来の Embarcadero Delphi デモ アプリケーション MastApp を FireDAC および InterBase DBMS にどう移行するかを段階的に示しています。

なお、ここでの <Demos> は、Embarcadero RAD Studio デモ アプリケーションのルート フォルダを示しています。 通常、これは C:\Users\Public\Documents\Embarcadero\Studio\17.0\Samples になります。

ステップ 1

<Demos>\Delphi\Database\FireDAC\Tool\reFind\BDE2FDMigration\Demo フォルダに移動します。 この中には、MastApp アプリケーション ソースのコピーが含まれています。 新しいサブディレクトリ FireDAC_MastApp を作成します。 そこに MastApp のソース ファイルをコピーして、元のソースを保存しておきます。

ステップ 2

コマンド ウィンドウを開き FireDAC_MastApp ディレクトリに移動するか、好みのディレクトリ マネージャ(たとえば FAR など)を使用します。 BDE 用語を対応する FireDAC 用語に置き換えるため、RAD Studio のツール reFind を実行します:

<RAD Studio>\Bin\reFind.exe *.pas *.dfm /X:<Demos>\Delphi\Database\FireDAC\Tool\reFind\BDE2FDMigration\FireDAC_Migrate_BDE.txt.

ステップ 3

FireDAC の接続定義を作成するには、FireDAC エクスプローラを使用します。 その後、接続定義パラメータをセットアップします。 以下は、MastApp の最も簡単な接続定義です。

 [MASTSQL]
 DriverID=IB
 Protocol=TCPIP
 Server=127.0.0.1
 DataBase=C:\MastApp.GDB
 User_Name=sysdba
 SQLDialect=3
 CharacterSet=UTF8
 ExtendedMetadata=True

メモ: ここでは、InterBase の C:\MastApp.GDB データベースを作成し、その C:\MastApp.GDB データベースに DBDEMOS データベース(Paradox)を読み込んでいます。 それには、Clever Components 社の InterBase DataPump を使用できます。

ステップ 4

DBMS 固有の FireDAC ドライバをアプリケーションに追加します。 FireDAC.Phys.<DBMS ドライバ ID> ユニットのいずれかをプロジェクトに追加します。 たとえば、InterBase を使用している場合は、FireDAC.Phys.IB をプロジェクトに追加します。 次に、以下のように FireDAC.VCLUI.Wait ユニットをプロジェクトに追加します。

 program Mastapp;
 uses
   Forms,
   FireDAC.Phys.IB,
   FireDAC.VCLUI.Wait,
   MAIN in 'MAIN.PAS' {MainForm},
   ......

ステップ 5

さて、テキスト エディタで DataMod.dfm ファイルを開きます。 このデータ モジュールに TFDConnection コンポーネントをセットアップします。 ConnectionDefName を InterBase 接続定義に設定します。 また、ユーザー名とパスワードも正しいものに変更します。 最終的に以下のようになります。

 Params.Strings = (
   'ConnectionDef=MASTSQL'
   'User_Name=sysdba'
   'Password=masterkey')

ステップ 6

InterBase SQLLink ドライバと FireDAC InterBase ドライバではデータ型マッピングが異なるので、FireDAC の型マッピングを調整して BDE と互換性のあるものにする必要があります。 そうでなければ、すべての永続フィールドを作成し直す必要があります。 データ型マッピングをセットアップするには、コレクション プロパティ TFDConnection.FormatOptions.MapRules に値を入力する必要があります。 DataMod.DFM でそれを行いましょう:

 object Database: TFDConnection
 ......
   FormatOptions.OwnMapRules = True
   FormatOptions.MapRules = <
     item
       PrecMax = 10
       PrecMin = 0
       ScaleMax = 0
       ScaleMin = 0
       SourceDataType = dtFmtBCD
       TargetDataType = dtInt32
     end
     item
       SourceDataType = dtFmtBCD
       TargetDataType = dtDouble
     end
     item
       SourceDataType = dtDateTimeStamp
       TargetDataType = dtDateTime
     end>
 ......
 end

さらに、FormatOptions.StrsTrim プロパティを False に設定します。このプロパティのデフォルト値は BDE と互換性がないからです。

ステップ 7

FireDAC では、Paradox や Dbase などのデスクトップ DB をサポートしていません。 そのため、以下のように、デスクトップ DB(Paradox や Dbase など)に関係するコードをすべてアプリケーションから削除する必要があります。

  • DataMod.pas 内の TMastData.UseLocalData メソッド
  • Main.pas 内の TMainForm.ViewLocalClick メソッド

ステップ 8

次に、以下のように、アプリケーションのソース コードを InterBase に合わせて修正しなければなりません。

  • Main.pas 内の TMainForm.ViewRemoteClick メソッドで、" (Local Interbase)" という文字列を " (InterBase)" に置き換えます。
  • Main.pas 内の TMainForm.ViewMenuClick ハンドラを削除します。
  • DataMod.pas 内の TMastData.DataDirectory メソッドを削除します。
  • アプリケーションでは、DB 接続定義が存在しなければ、その場で作成します。 そのため、DataMod.pas 内の TMastData.UseRemoteData を以下のように変更します。
 procedure TMastData.UseRemoteData;
 var
   Params: TStringList;
 begin
   { ConnectionDef が存在するか確認し、なかったら追加する。 }
   if not FDManager.IsConnectionDef('MASTSQL') then
   begin
     Params := TStringList.create;
     try
       Params.Values['Protocol'] := 'TCPIP';
       Params.Values['Server'] := '127.0.0.1';
       Params.Values['DataBase'] := 'C:\MastApp.GDB';
       Params.Values['User_Name'] := 'sysdba';
       Params.Values['SQLDialect'] := '3';
       Params.Values['CharacterSet'] := 'UTF8';
       Params.Values['ExtendedMetadata'] := 'True';
       FDManager.AddConnectionDef('MASTSQL', 'IB', Params);
     finally
       Params.Free;
     end;
   end;
   SetDatabaseConnectionDef('MASTSQL');
 end;
  • アプリケーションで使用する SQL コマンドを調整する必要があります。 DataMod で、CustByLastInvQuery クエリに DESCENDING がキーワードとして含まれていますが、InterBase では DESC を使用します。