Fehlerbehandlung (FireDAC)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Arbeiten mit Verbindungen (FireDAC)


In diesem Thema wird beschrieben, wie mit FireDAC Datenbankfehler behandelt werden.

Allgemeine Informationen

Die Klasse EFDDBEngineException ist die Basisklasse für alle DBMS-Exceptions. Ein einzelnes Exception-Objekt ist eine Sammlung von Datenbankfehlern, auf die über die Eigenschaft EFDDBEngineException.Errors[] zugegriffen werden kann und die durch die Klasse TFDDBError dargestellt werden.

FireDAC kombiniert "Personalisierung" und Vereinheitlichung der EFDDBEngineException-Exception und der TFDDBError-Fehlerklassen. "Personalisierung" bedeutet, dass ein Treiber über eigene Exception- und Fehlerklassen verfügt, die DBMS-spezifische Informationen enthalten:

DBMS Exception-Klasse Fehlerklasse
Advantage Database FireDAC.Phys.ADSWrapper.EADSNativeException FireDAC.Stan.Error.TFDDBError
DataSnap-Server FireDAC.Phys.TDBXBase.ETDBXNativeException FireDAC.Stan.Error.TFDDBError
dbExpress v4 FireDAC.Phys.TDBXBase.ETDBXNativeException FireDAC.Stan.Error.TFDDBError
Firebird FireDAC.Phys.IBWrapper.EIBNativeException FireDAC.Phys.IBWrapper.TFDIBError
IBM DB2 FireDAC.Phys.DB2.EDB2NativeException FireDAC.Phys.ODBCWrapper.TFDODBCNativeError
Informix FireDAC.Phys.Infx.EInfxNativeException FireDAC.Phys.Infx.TFDInfxError
InterBase FireDAC.Phys.IBWrapper.EIBNativeException FireDAC.Phys.IBWrapper.TFDIBError
Microsoft Access FireDAC.Phys.MSAcc.EMSAccessNativeException FireDAC.Phys.ODBCWrapper.TFDODBCNativeError
Microsoft SQL Server FireDAC.Phys.MSSQL.EMSSQLNativeException FireDAC.Phys.MSSQL.TFDMSSQLError
MySQL FireDAC.Phys.MySQLWrapper.MySQLNativeException FireDAC.Phys.MySQLWrapper.TFDMySQLError
ODBC FireDAC.Phys.ODBCWrapper.EODBCNativeException FireDAC.Phys.ODBCWrapper.TFDODBCNativeError
Oracle FireDAC.Phys.OracleWrapper.EOCINativeException FireDAC.Phys.OracleWrapper.TOCIError
PostgreSQL FireDAC.Phys.PGWrapper.EPgNativeException FireDAC.Phys.PGWrapper.TFDPgError
SQLite FireDAC.Phys.SQLiteWrapper.ESQLiteNativeException FireDAC.Stan.Error.TFDDBError
Sybase SQL Anywhere FireDAC.Phys.ASAWrapper.EASANativeException FireDAC.Phys.ODBCWrapper.TFDODBCNativeError
Teradata Database FireDAC.Phys.TData.ETDataNativeException FireDAC.Phys.ODBCWrapper.TFDODBCNativeError

TADDBError verfügt über die Eigenschaft ErrorCode, die den nativen DBMS-Fehlercode darstellt.

"Vereinheitlichung" bedeutet, dass alle Treiber-Exception-Klassen von EFDDBEngineException geerbt sind – eine einzelne Basisklasse, die treiberunabhängige Informationen enthält. Deren Eigenschaft Kind ist ein DBMS-unabhängiger Fehlercode. Beispielsweise könnte der Code zur Behandlung einer Verletzung des eindeutigen Schlüssels wie folgt lauten:

try
  FDQuery1.ExecSQL('insert into MyTab(code, name) values (:code, :name)', [100, 'Berlin']);
except
  on E: EFDDBEngineException do begin
    if E.Kind = ekUKViolated then
      ShowMessage('Please enter unique value !');
    raise;
  end;
end;

Fehlerinformationen

Die Fehlerinformationen werden hauptsächlich durch die EFDDBEngineException-Eigenschaften dargestellt:

  • Errors – die Sammlung der TFDDBError-Objekte.
  • ErrorCount – die Anzahl der Fehler in der Errors-Sammlung.
  • Kind – die DBMS-unabhängige Fehlerart.
  • Message – die eigentliche Fehlermeldung.

Und durch die TFDDBError-Eigenschaften:

  • ErrorCode – der DBMS-herstellerspezifische Fehlercode.
  • Kind – die DBMS-unabhängige Fehlerart.
  • Message – die Fehlermeldung.

Zur Vereinfachung des Debuggens der Anwendung oder zur Steigerung des Informationsgehalts der Exception-Protokollierung stellt EFDDBEngineException die Eigenschaften SQL und Params bereit.

Darüber hinaus sind je nach Fehlerbereich und der Möglichkeit des DBMS, erweiterte Fehlerinformationen zu liefern, die folgenden TFDDBError-Eigenschaften nützlich:

  • Bei einem SQL-Analysefehler gibt CommandTextOffset den Offset im SQL-Anweisungstext zurück.
  • Bei einer Bedingungsverletzung, einem Fehler bei einer DB-Objektänderung oder einigen anderen Fehlern gibt die Eigenschaft ObjName den Datenbankobjektnamen zurück.
  • Bei einem Array DML-Fehler gibt RowIndex den Array-Zeilenindex zurück, zu dem der Fehler gehört.

Behandeln von Exceptions

Exceptions können auf eine der folgenden Weisen verarbeitet werden:

  • Verwenden der Konstruktion "try/except/end". Das ist eine Standardmöglichkeit in Delphi zum Behandeln von Exceptions. Zum Beispiel:
FDConnection1.StartsTransaction;
try
  FDQuery1.ExecSQL;
  FDConnection1.Commit;
except
  on E: EFDDBEngineException do begin
    FDConnection1.Rollback;
    // do something here
    raise;
  end;
end;
  • Festlegen der Ereignisbehandlungsroutine TFDQuery.OnError.
  • Festlegen der Ereignisbehandlungsroutine TFDConnection.OnError. Damit lassen sich die Exception-Protokollierung oder die Exception-"Anpassung" optimal behandeln. Zum Beispiel:
procedure TForm1.FDConnection1Error(ASender: TObject; const AInitiator: IFDStanObject;
  var AException: Exception);
var
  oExc: EFDDBEngineException;
begin
  if AException is EFDDBEngineException then begin
    oExc := EFDDBEngineException(AException);
    if oExc.Kind = ekRecordLocked then
      oExc.Message := 'Please, try the operation later. At moment, the record is busy'
    else if (oExc.Kind = ekUKViolated) and SameText(oExc[0].ObjName, 'UniqueKey_Orders') then
      oExc.Message := 'Please, provide the unique order information. It seems, your order was already put';
  end;
end;

FDConnection1.OnError := FDConnection1Error;

Verwenden des Fehler-Dialogfeldes für Endbenutzer

Mit der Komponente TFDGUIxErrorDialog können Endbenutzer über von der Datenbank zurückgegebene Fehler benachrichtigt werden:

FireDACErrorPicture.png

Legen Sie die Komponente einfach an einer beliebigen Stelle auf einem Formular ab, um das Dialogfeld zu verwenden. Das Dialogfeld fängt die Ereignisbehandlungsroutine TApplication.OnException ab und zeigt das Dialogfeld an, wenn eine unbehandelte FireDAC-Exception vorhanden ist. Auf der Seite "Abfrage" wird der von der Exception produzierte SQL-Anweisungstext angezeigt. Durch Drücken von STRG+C im Dialogfeld werden die gesamten Exception-Informationen in die Zwischenablage kopiert.

Siehe auch