Fehlerbehandlung (FireDAC)
Nach oben zu Arbeiten mit Verbindungen (FireDAC)
In diesem Thema wird beschrieben, wie mit FireDAC Datenbankfehler behandelt werden.
Inhaltsverzeichnis
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.ODBCWrapper.TFDODBCNativeError |
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;
- Festlegen der Ereignisbehandlungsroutine TFDQuery.OnExecuteError zur Behandlung von Array DML-spezifischen Fehlern.
- Festlegen der Ereignisbehandlungsroutine TFDQuery.OnUpdateError zur Behandlung von Fehlern beim Eintragen von Aktualisierungen.
- Festlegen der Ereignisbehandlungsroutinen TFDConnection.OnLost, OnRestored, OnRecover zur Behandlung von Verbindungsabbruchfehlern.
Verwenden des Fehler-Dialogfeldes für Endbenutzer
Mit der Komponente TFDGUIxErrorDialog können Endbenutzer über von der Datenbank zurückgegebene Fehler benachrichtigt werden:
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
- Wiederherstellen von Verbindungen
- Ausführen von Anweisungen
- FireDAC.Stan.Error-Namespace
- TFDCustomConnection.OnError-Ereignis
- TFDAdaptedDataSet.OnError-Ereignis