Gestion des erreurs (FireDAC)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Utilisation des connexions (FireDAC)


Cette rubrique explique comment gérer les erreurs de base de données avec FireDAC.

Informations générales

EFDDBEngineException est la classe de base de toutes les exceptions de SGBD. Un objet exception unique est une collection d'erreurs de base de données, accessible via la propriété EFDDBEngineException.Errors[] et représentée par la classe TFDDBError.

FireDAC combine la "personnalisation" et l'unification de l'exception EFDDBEngineException et des classes d'erreurs TFDDBError. "Personnalisation" signifie qu'un pilote peut avoir ses propres classes d'exceptions et d'erreurs, qui contiennent des informations spécifiques au SGBD :

SGBD Classe d'exception Classe d'erreur
Advantage Database FireDAC.Phys.ADSWrapper.EADSNativeException FireDAC.Stan.Error.TFDDBError
Serveur DataSnap 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.EMySQLNativeException 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
Base de données Teradata FireDAC.Phys.TData.ETDataNativeException FireDAC.Phys.ODBCWrapper.TFDODBCNativeError

TFDDBError a une propriété ErrorCode, qui représente le code d'erreur natif du SGBD.

"Unification" signifie que toutes les classes d'exceptions des pilotes sont héritées d'EFDDBEngineException (classe de base contenant des informations indépendantes du pilote). Sa propriété Kind est un code d'erreur indépendant du SGBD. Par exemple, le code pour gérer une violation de clé unique peut être le suivant :

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

Informations d'erreurs

Les informations d'erreurs sont principalement présentées par les propriétés EFDDBEngineException :

  • Errors -- la collection des objets TFDDBError.
  • ErrorCount -- le nombre d'erreurs dans la collection Errors.
  • Kind -- le type d'erreur indépendant du SGBD.
  • Message -- le message d'erreur réel.

Et par les propriétés TFDDBError :

  • ErrorCode -- le code d'erreur spécifique au fournisseur du SGBD.
  • Kind -- le type d'erreur indépendant du SGBD.
  • Message -- le message d'erreur.

Pour simplifier le débogage de l'application ou pour rendre la journalisation des exceptions plus informative, EFDDBEngineException fournit les propriétés SQL et Params.

De même, selon la zone d'erreur et la capacité du SGBD à fournir des informations avancées sur les erreurs, les propriétés TFDDBError suivantes peuvent s'avérer utiles :

  • Quand une erreur d'analyse SQL est impliquée, CommandTextOffset renvoie le décalage dans le texte de la commande SQL.
  • Quand une violation de contrainte, un échec de modification des objets de la base de données ou d'autres erreurs sont impliquées, la propriété ObjName renvoie le nom d'un objet de base de données.
  • Quand une erreur Array DML est impliquée, RowIndex renvoie l'index de ligne du tableau auquel appartient l'erreur.

Gestion des exceptions

Les exceptions peuvent être traitées selon l'une des méthodes suivantes :

  • en utilisant la construction try/except/end. Il s'agit de la méthode standard pour gérer les exceptions dans Delphi. Par exemple :
FDConnection1.StartsTransaction;
try
  FDQuery1.ExecSQL;
  FDConnection1.Commit;
except
  on E: EFDDBEngineException do begin
    FDConnection1.Rollback;
    // do something here
    raise;
  end;
end;
  • définition du gestionnaire d'événement TFDQuery.OnError.
  • définition du gestionnaire d'événement TFDConnection.OnError. Ces deux méthodes permettent de gérer la journalisation ou "l'ajustement" des exceptions. Par exemple :
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;

Utilisation de la boîte de dialogue Erreur de l'utilisateur final

Un utilisateur final peut être notifié des erreurs renvoyées par la base de données grâce au composant TFDGUIxErrorDialog :

FireDACErrorPicture.png

Pour utiliser cette boîte de dialogue, il vous suffit de déposer le composant sur une fiche. La boîte de dialogue intercepte le gestionnaire d'événement TApplication.OnException et s'affiche en cas d'exception FireDAC non gérée. La page "Requête" vous permet de voir le texte de commande SQL produit par l'exception. Dans la boîte de dialogue, la combinaison de touches Ctrl+C place dans le presse-papiers toutes les informations concernant l'exception.

Voir aussi