Weitere Hinweise zur dbExpress-Migration (FireDAC)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Migrieren von dbExpress-Anwendungen nach FireDAC


Allgemeine Informationen

Inkompatible Eigenschaften und Methoden

Einige Eigenschaften werden automatisch vom Migrationsskript FireDAC_Migrate_DBX.txt entfernt, weil in FireDAC dafür keine Entsprechungen vorhanden sind:

  • TSQLConnection:
    • AutoClone – FireDAC unterstützt mehrere aktive Anweisungen pro Verbindung für alle Datenbanken.
    • LocaleCode – ist nicht anwendbar.
    • UniqueID – ist nicht anwendbar.
    • GetDriverFunc – FireDAC verwendet eine andere Treiberarchitektur.
    • LibraryName – FireDAC verwendet eine andere Treiberarchitektur.
    • ValidatePeerCertificate – wird nicht unterstützt.
  • TCustomSQLDataSet:
    • MaxBlobSize – FireDAC ruft einen BLOB-Wert immer insgesamt ab.

Einige Eigenschaften und Methoden sollten manuell entfernt oder ersetzt werden, weil in FireDAC keine direkten Entsprechungen dafür vorhanden sind und die Anwendung deshalb nicht funktionieren könnte:

  • IConnectionAdmin:
    • GetDelegateDriverNames – FireDAC unterstützt das "Delegattreiber"-Konzept nicht.
    • RegisterDriver/UnregisterDriver – Ein FireDAC-Treiber wird beim Einbinden in die Anwendung automatisch registriert.
  • TSQLConnection:
    • GetCommandTypes – FireDAC-Anweisungsarten werden durch TFDPhysCommandKind aufgelistet.
    • GetServerMethodNames – Verwenden Sie für FireDAC-DataSnap-Verbindungen die mkProcs-Abfrage von Metainformationen, um die Liste der Servermethoden abzurufen.
    • SetTraceEvent/TraceCallbackEvent – FireDAC verwendet eine andere Nachverfolgungs-/Überwachungs-API.
    • MaxStmtsPerConn – FireDAC lässt eine unbegrenzte Anzahl von Anweisungen pro Verbindung zu.
    • VendorLib – Verwenden Sie die Eigenschaft TFDPhysXxxDriverLink.VendorLib oder FDDrivers.ini.
    • LoadParamsOnConnect/ParamsLoaded/LoadParamsFromIniFile – FireDAC verwendet eine andere Verbindungsdefinitions-API.
  • TCustomSQLDataSet:
    • GetCommandNames – FireDAC-Anweisungsnamen werden durch TFDPhysCommandKind und TFDPhysMetaInfoKind aufgelistet.
    • SetSchemaInfo, SchemaName, GetMetadata – Verwenden Sie stattdessen TFDMetaInfoQuery.
    • ParseSelectSql, ParseDeleteSql, ParseUpdateSql, ParseInsertSql – FireDAC unterstützt diese API nicht. Sie können stattdessen UpdateOptions.UpdateTableName, TField.ProviderFlags usw. verwenden.
  • TSQLMonitor – FireDAC verwendet eine andere Nachverfolgungs-/Überwachungs-API.

FireDAC emuliert zahlreiche inkompatible Eigenschaften und Methoden von dbExpress. Damit die Emulation aktiviert wird, bezieht das Migrationsskript FireDAC_Migrate_DBX.txt die Unit FireDAC.DBX.Migrate in die uses-Klausel Ihrer FireDAC-Anwendung ein.

Hinweis: Ersetzen Sie die emulierten Methoden durch native FireDAC-Methoden, um eine vollständige Kontrolle zu ermöglichen.

Exception-Behandlung

TDBXError ist die für dbExpress spezifische Exception-Klasse. FireDAC enthält eine entsprechende Klasse, nämlich die Klasse EFDDBEngineException.

Bei der Behandlung von dbExpress-Exceptions ermitteln Programmierer mit der Eigenschaft Message oder ErrorCode den Fehlertyp. FireDAC verfügt über die Eigenschaft Kind, die einen Aufzählungswert zurückgibt. Weitere Informationen finden Sie unter Fehlerbehandlung in FireDAC.

Ersetzen Sie beispielsweise den folgenden dbExpress-Code durch FireDAC-Code:

  • Für Delphi:
if (E is TDBXError) and (Pos('unique key violated', TDBXError(E).Message) > 0) then
  MetaBaseDBError(SMb_DataSetInvalidPKeyValue, E);
if (E is EFDDBEngineException) and (EFDDBEngineException(E).Kind = ekUKViolated) then
  MetaBaseDBError(SMb_DataSetInvalidPKeyValue, E);

Wartecursor

Ersetzen Sie beispielsweise den folgenden dbExpress-Code durch FireDAC-Code:

  • Für Delphi:
Screen.Cursor := crSQLWait;
try
  ......
finally
  Screen.Cursor := crDefault;
end;
uses
  FireDAC.Stan.Factory, FireDAC.UI.Intf;
  ......
var
  oWait: IFDGUIxWaitCursor;
  ......
  FDCreateInterface(IFDGUIxWaitCursor, oWait);
  oWait.StartWait;
  try
    ......
  finally
    oWait.StopWait;
  end;

Fremdhersteller-Integration

Für viele Produkte von Fremdherstellern, wie Tools zur Berichtserstellung oder mehrschichtige Bibliotheken, ist eine DAC-Adapter-Unit erforderlich. Wenden Sie sich an den entsprechenden Produkthersteller, um zu erfragen, wie Sie einen Adapter für FireDAC erhalten.


Low-Level-API

FireDAC verfügt über keine Entsprechung für die dbExpress-API/Data.DBXCommon. Der Code, der die dbExpress-API/Data.DBXCommon verwendet, sollte neu geschrieben und dabei nur die FireDAC-API (API der Schichten DatS und Phys) verwendet werden. Weitere Informationen dazu finden Sie unter FireDAC (allgemeine Übersicht). Es gibt keine direkte Lösung.

Treiber und Verbindungen

Festlegen von Treibern und Client-Bibliotheken

dbExpress hat viel Parameter zum Verknüpfungen von Treibern, wie DriverUnit, DriverPackageLoader, DriverAssemblyLoader, MetaDataPackageLoader, MetaDataAssemblyLoader, GetDriverFunc, LibraryName, LibraryNameOsx. Für keinen davon gibt es in FireDAC eine Entsprechung. Ein FireDAC-Treiber kann stattdessen entweder statisch oder dynamisch mit vorerzeugten FireDAC-Packages gelinkt werden. Weitere Informationen dazu finden Sie unter Bereitstellen von FireDAC-Anwendungen.

In dbExpress können Sie in den Verbindungsparametern den Parameter VendorLib angeben. FireDAC unterstützt dies nicht. Um einen FireDAC-Treiber zu konfigurieren, legen Sie den Eigenschaftswert TFDPhysXxxDriverLink.VendorLib fest, oder verwenden Sie die Datei FDDrivers.ini. Weitere Informationen dazu finden Sie unter Konfigurieren von FireDAC-Treibern.

Ersetzen Sie beispielsweise den folgenden dbExpress-Code durch FireDAC-Code:

  • Für Delphi:
SQLConnection1.Params.Add('VendorLib=' + ExtractFilePath(Application.ExeName) + 'libmysql.dll');
FDPhysMySQLDriverLink1.VendorLib := ExtractFilePath(Application.ExeName) + 'libmysql.dll';

Festlegen einer Verbindung

In dbExpress wird ein gespeicherter Satz von Verbindungsparametern als benannte Verbindung bezeichnet und in der Datei dbxConnections.ini gespeichert. Um diese benannten Verbindungen in einer Anwendung zu verwalten, können Sie die von GetConnectionAdmin zurückgegebene Interface-Referenz IConnectionAdmin verwenden. In FireDAC wird der gespeicherte Satz von Verbindungsparametern Verbindungsdefinition genannt und in der Datei FDConnectionDefs.ini gespeichert (siehe Definieren von Verbindungen in FireDAC). Mit der Komponente FDManager verwalten Sie Verbindungsdefinitionen.

Um in dbExpress zur Laufzeit die Verbindungsparameter aus einer benannten Verbindung (automatisch) zu laden, verwendet die Anwendung ConnectionName und LoadParamsOnConnect oder LoadParamsFromIniFile. Eine FireDAC-Anwendung legt nur ConnectionDefName fest.

Ersetzen Sie beispielsweise den folgenden dbExpress-Code durch FireDAC-Code:

  • Für Delphi:
SQLConnection1.ConnectionName := 'IBConn';
// loads parameters of 'IBConn' named connection from dbxConnections.ini
SQLConnection1.LoadParamsFromIniFile;
SQLConnection1.Connected := True;
// will load parameters of 'IBConn' connection definition from FDConnectionDefs.ini
FDConnection1.ConnectionDefName := 'IBConn';
FDConnection1.Connected := True;

Anmelden bei einer Datenbank

dbExpress verwendet die Standard-VCL- oder FireMonkey-Anmeldedialogfelder. Für FireDAC müssen Sie die Komponente TFDGUIxLoginDialog verwenden und TFDConnection.LoginDialog auf diese Komponente setzen (siehe Herstellen von Verbindungen in FireDAC).

Das Ereignis TFDConnection.OnLogin ist nicht mit der Parameterliste des Ereignisses TSQLConnection.OnLogin kompatibel.

Sie müssen die Deklaration der folgenden Behandlungsroutine (nach Anwenden von FireDAC_Migrate_DBX.txt) in FireDAC-Code ändern:

  • Für Delphi:
procedure TMyDataModule.dbLogin(Database: TFDConnection; LoginParams: TStrings);
begin
  LoginParams.Values['User_Name'] := 'me';
  LoginParams.Values['Password'] := 'pwd';
end;
procedure TMyDataModule.dbLogin(Database: TFDCustomConnection; LoginParams: TFDConnectionDefParams);
begin
  LoginParams.Values['User_Name'] := 'me';
  LoginParams.Values['Password'] := 'pwd';
end;

Steuern von Transaktionen

Die API zur Steuerung von dbExpress-Transaktionen unterstützt mehrere aktive, aber keine verschachtelten Transaktionen. Für mehrere Transaktionen wird das ID-basierte Vorgehen verwendet.

FireDAC unterstützt mehrere aktive und verschachtelte Transaktionen (weitere Informationen finden Sie unter Verwalten von Transaktionen (FireDAC)). Für mehrere Transaktionen kann eine Anwendung mehrere mit derselben TFDConnection verbundene TFDTransaction-Komponenten verwenden. Für verschachtelte Transaktionen können die Aufrufe von StartTransaction/Commit/Rollback verschachtelt sein.

Die Unit FireDAC.DBX.Migrate emuliert die API zur Steuerung von dbExpress-Transaktionen, unterstützt aber mehrere aktive Transaktionen nicht. Zur Unterstützung von mehreren aktiven Transaktionen muss der Code geändert werden.

Ersetzen Sie beispielsweise den folgenden Code durch FireDAC-Code:

  • Für Delphi:
uses
  FireDAC.DBX.Migrate;
...
var
  oTx1: TFDDBXTransaction;
...
oTx1 := FDConnection1.BeginTransaction;
try
  ...
  FDConnection1.CommitFreeAndNil(oTx1);
except
  FDConnection1.RollbackFreeAndNil(oTx1);
  raise;
end;
FDTransaction1.StartTransaction;
try
  ...
  FDTransaction1.Commit;
except
  FDTransaction1.Rollback;
  raise;
end;

Ablaufverfolgung

Ablaufverfolgungsfunktionen von dbExpress basieren auf der Komponente TSQLMonitor und der Ereignisbehandlungsroutine TSQLConnection.TraceCallbackEvent. Die Ablaufverfolgungsfunktionen von FireDAC basieren auf dem Satz der TFDMoniXxxClientLink-Komponenten und dem Verbindungsdefinitionsparameter MonitorBy=Xxx (weitere Informationen dazu finden Sie unter Ablaufverfolgung und Überwachung (FireDAC)).

Beide Bibliotheken sind in diesem Bereich nicht kompatibel, daher muss die Konfiguration der dbExpress-Ablaufverfolgung vollständig durch die FireDAC-Konfiguration ersetzt werden. Verwenden Sie beispielsweise den folgenden Code, um die Ablaufverfolgungsausgabe für eine FireDAC-Verbindung zu aktivieren:

  • Für Delphi:
FDMoniRemoteClientLink1.Tracing := True;
FDConnection1.Params.Add('MonitorBy=Remote');
FDConnection1.Connected := True;

Verbindungsmetainformationen

dbExpress stellt in der Eigenschaft TSQLConnection.MetaData verbindungsspezifische Metadaten-Eigenschaften bereit. Diese Eigenschaft gibt eine Referenz auf das Objekt TDBXDatabaseMetaData zurück. FireDAC stellt in der Eigenschaft TFDConnection.ConnectionMetaDataIntf ähnliche Metadaten-Eigenschaften bereit. Diese Eigenschaft gibt eine Referenz auf das Interface IFDPhysConnectionMetadata zurück.

Die TDBXDatabaseMetaData- und IFDPhysConnectionMetadata-APIs sind nicht kompatibel.

Datenmengen und Anweisungen

Allgemeine Informationen

Folgende Hauptunterschiede bestehen zwischen dbExpress- und FireDAC-Datenmengen:

  • dbExpress-Datenmengen sind unidirektional. dbExpress-Datenmengen speichern abgerufene Datensätze nicht zwischen. Eine Anwendung kann in einer Ergebnismenge keine zufällige Position festlegen.
  • dbExpress-Datenmengen verfügen nur über begrenzte clientseitige Funktionen. Sie unterstützen keine Sortierung, Filterung, Bereiche, Aggregate usw.
    • FireDAC-Datenmengen verfügen über fortgeschrittene clientseitige Funktionen.
  • dbExpress-Datenmengen sind schreibgeschützt. Sie unterstützen keine Bearbeitung von Datensätzen, kein automatisches Eintragen von Aktualisierungen, keine zwischengespeicherten Aktualisierungen usw.
    • FireDAC-Datenmengen verfügen über fortgeschrittene Aktualisierungsfunktionen.

Um die oben genannten dbExpress-Beschränkungen zu vermeiden, werden in vielen dbExpress-Anwendungen die Komponenten TDataSetProvider und TClientDataSet verwendet. Nach der Migration einer dbExpress-Anwendung nach FireDAC müssen Sie die Komponenten TDataSetProvider und TClientDataSet löschen und dürfen nur FireDAC-Datenmengen verwenden.

Kompatibilität

dbExpress-Datenmengen (die Verwendung von dbExpress-Datenmengen, TDataSetProvider und TClientDataSet) und FireDAC-Datenmengen verarbeiten Daten geringfügig unterschiedlich. Um die Kompatibilität von FireDAC-Datenmengen zu erzwingen, setzen Sie FormatOptions.DataSnapCompatibility auf True.

dbExpress-Datenmengen verwenden die Positionsparameterbindung. Das bedeutet, dass die Parameter in der Params-Sammlung mit den Parametermarkern im SQL-Anweisungstext anhand der Position, nicht anhand der Namen abgeglichen werden. FireDAC verwendet standardmäßig die Parameterbindung anhand von Namen.

In den folgenden Fällen können Probleme auftreten:

  • Derselbe benannte Parametermarker kommt zwei- oder mehrmals im SQL-Anwendungstext vor.
  • Die Reihenfolge der Parameter in der Params-Sammlung weicht von der Reihenfolge der Parametermarker im SQL-Anwendungstext ab.

Um diese Probleme zu beheben, können Sie:

  • Den SQL-Anwendungstext ändern und nur eindeutige Namen von Parametermarkern verwenden.
  • Den Params.BindMode der FireDAC-Datenmenge auf pbByNumber setzen.

Persistente Felder

dbExpress-Anwendungen mit persistenten Feldern müssen zusätzlich angepasst werden.

dbExpress verwendet weder die Eigenschaften Origin und ProviderFlags für persistente Felder noch das Abfrage-DB-Dictionary oder stellt diese bereit, um die eindeutigen Kennzeichnungsfelder abzurufen. FireDAC verwendet und stellt die Eigenschaften Origin und ProviderFlags für persistente Felder bereit. Das Migrationsskript "FireDAC_Migrate_DBX.txt" entfernt alle TField.Origin-Werte aus DFM-Dateien. Wenn Origin leer ist (wie in einer dbExpress-Anwendung), verwendet FireDAC den Feldnamen. Im Vorgabewert von ProviderFlags ist pfInKey aber nicht enthalten, und FireDAC fragt die Datenbank nicht nach Primärschlüsselfeldern ab. FireDAC kann daher die eindeutigen Kennzeichnungsfelder nicht abrufen, und Sie müssen eine der folgenden Aktionen ausführen:

  • Neuerstellen von persistenten Feldern.
  • Manuelles Anpassen von ProviderFlags.
  • Manuelles Festlegen von UpdateOptions.KeyFields.

TSQLTable

TFDTable von FireDAC entspricht TTable der BDE und TSQLTable von dbExpress. Wir empfehlen Ihnen, bei der Migration nach FireDAC, alle Vorkommen von TSQLTable durch TFDQuery zu ersetzen.

TSQLDataSet

FireDAC verfügt über keine direkt entsprechende Klasse für TSQLDataSet.

Es gibt verschiedene Ersetzungsoptionen:

Ersetzen Sie beispielsweise den folgenden dbExpress-Code durch FireDAC-Code:

  • Für Delphi:
SQLDataSet1.CommandType := ctQuery;
SQLDataSet1.CommandText := 'select * from tab';
SQLDataSet1.Open;
SQLDataSet2.CommandType := ctTable;
SQLDataSet2.CommandText := 'tab';
SQLDataSet2.Open;
FDQuery1.SQL.Text := 'select * from tab';
FDQuery1.Open;
FDTable1.TableName := 'tab';
FDTable1.Open;

Ersetzen Sie beispielsweise den folgenden dbExpress-Code durch FireDAC-Code:

  • Für Delphi:
SQLDataSet1.SetSchemaInfo(stTables, '', '', '');
SQLDataSet1.Open;
SQLDataSet2.SetSchemaInfo(stColumns, 'TAB', '', '');
SQLDataSet2.Open;
FDMetaInfoQuery1.MetaInfoKind := mkTables;
FDMetaInfoQuery1.Open;
FDMetaInfoQuery2.ObjectName := 'TAB';
FDMetaInfoQuery2.Open;

Siehe auch