BDE アプリケーションの移行(FireDAC)
FireDAC への BDE アプリケーションの移行 への移動
この例では、従来の Embarcadero Delphi デモ アプリケーション MastApp を FireDAC および InterBase DBMS にどう移行するかを段階的に示しています。
ステップ 1
C:\Users\Public\Documents\Embarcadero\Studio\20.0\Samples\Object Pascal\Database\FireDAC\Tool\reFind\BDE2FDMigration\Demo
フォルダに移動します。この中には、MastApp アプリケーション ソースのコピーが含まれています。 新しいサブディレクトリ FireDAC_MastApp を作成します。 そこに MastApp のソース ファイルをコピーして、元のソースを保存しておきます。
ステップ 2
コマンド ウィンドウを開き FireDAC_MastApp ディレクトリに移動するか、好みのディレクトリ マネージャ(たとえば FAR など)を使用します。 BDE 用語を対応する FireDAC 用語に置き換えるため、RAD Studio のツール reFind を実行します:
C:\Program Files (x86)\Embarcadero\Studio\20.0\bin\reFind.exe *.pas *.dfm /X:C:\Users\Public\Documents\Embarcadero\Studio\20.0\Samples\Object Pascal\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
{ See if the ConnectionDef exists. If not, add it. }
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 を使用します。