Migration von BDE-Anwendungen (FireDAC)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Migrieren von BDE-Anwendungen nach FireDAC


In diesem Beispiel wird Schritt für Schritt gezeigt, wie Sie die klassische Embarcadero-Delphi-Demoanwendung "MastApp" nach FireDAC und auf ein InterBase-DBMS migrieren.

Schritt 1

Wechseln Sie zum Ordner C:\Users\Public\Documents\Embarcadero\Studio\20.0\Samples\Object Pascal\Database\FireDAC\Tool\reFind\BDE2FDMigration\Demo. Dieser Ordner enthält die Quelldateien der MastApp-Anwendung. Erstellen Sie ein neues Unterverzeichnis, und nennen Sie es FireDAC_MastApp. Kopieren Sie dann die MastApp-Quelldateien in das neue Verzeichnis, damit die Originalquelldateien erhalten bleiben.

Schritt 2

Öffnen Sie ein Befehlsfenster, und wechseln Sie in das Verzeichnis "FireDAC_MastApp", oder verwenden Sie dazu Ihren bevorzugten Verzeichnismanager, z. B. FAR. Führen Sie das RAD Studio-Tool reFind aus, um die BDE-Begriffe durch die entsprechenden FireDAC-Begriffe zu ersetzen:

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.

Schritt 3

Erstellen Sie mit dem FireDAC-Explorer eine FireDAC-Verbindungsdefinition. Konfigurieren Sie dann die Verbindungsdefinitionsparameter. Im Folgenden finden Sie die einfachste Verbindungsdefinition für "MastApp":

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

Hinweis: Dies setzt voraus, dass Sie die InterBase-Datenbank C:\MastApp.GDB erstellt und die DBDEMOS-Datenbank (Paradox) in die Datenbank C:\MastApp.GDB geladen haben. Dafür können Sie Clever Components InterBase DataPump verwenden.

Schritt 4

Fügen Sie der Anwendung einen DBMS-spezifischen FireDAC-Treiber hinzu. Fügen Sie Ihrem Projekt eine der FireDAC.Phys.[DBMS-Treiber-ID]-Units hinzu. Wenn Sie z. B. InterBase verwenden, fügen Sie dem Projekt FireDAC.Phys.IB hinzu. Fügen Sie anschließend Ihrem Projekt die Unit FireDAC.VCLUI.Wait hinzu:

program Mastapp;

uses
  Forms,
  FireDAC.Phys.IB,
  FireDAC.VCLUI.Wait,
  MAIN in 'MAIN.PAS' {MainForm},
  // …

Schritt 5

Öffnen Sie nun die Datei "DataMod.dfm" in einem Texteditor. Konfigurieren Sie die TFDConnection-Komponente im Datenmodul. Setzen Sie ConnectionDefName auf eine InterBase-Verbindungsdefinition. Ändern Sie auch den Benutzernamen und das Passwort entsprechend. Das Ergebnis könnte in etwa folgendermaßen aussehen:

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

Schritt 6

Die InterBase-SQLLink- und FireDAC-InterBase-Treiber verwenden unterschiedliche Datentypzuordnungen. Dies müssen Sie anpassen, damit die FireDAC-Typzuordnung mit der BDE kompatibel ist. Ansonsten müssen alle persistenten Felder neu erstellt werden. Zum Einrichten der Datentypzuordnung muss die Sammlungseigenschaft TFDConnection.FormatOptions.MapRules ausgefüllt werden. Dies wird im folgenden Code in der Datei "DataMod.DFM" vorgenommen:

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

Setzen Sie außerdem die Eigenschaft FormatOptions.StrsTrim auf False, weil der Vorgabewert für diese Eigenschaft nicht mit der BDE kompatibel ist.

Schritt 7

FireDAC unterstützt keine Desktop-DBs, wie Paradox oder dBase. Daher muss der gesamte Code für Desktop-DBs (Paradox, dBase) aus der Anwendung entfernt werden:

  • Die Methode TMastData.UseLocalData in "DataMod.pas".
  • Die Methode TMainForm.ViewLocalClick in "Main.pas".

Schritt 8

Nun muss der Quellcode der Anwendung an InterBase angepasst werden:

  • Ersetzen Sie in "Main.pas" in der Methode TMainForm.ViewRemoteClick den String "(Local Interbase)" durch "(InterBase)".
  • Entfernen Sie die Ereignisbehandlungsroutine TMainForm.ViewMenuClick aus "Main.pas".
  • Entfernen Sie die Methode TMastData.DataDirectory aus "DataMod.pas".
  • Die Anwendung erstellt eine DB-Verbindungsdefinition, falls diese nicht vorhanden ist. Ändern Sie deshalb in "DataMod.pas" TMastData.UseRemoteData in:
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;
  • Sie müssen nun die von der Anwendung verwendeten SQL-Anweisungen anpassen. In DataMod wird bei der Abfrage "CustByLastInvQuery" das Schlüsselwort DESCENDING verwendet, für InterBase muss dies aber DESC lauten.