Gestion des erreurs (FireDAC)
Remonter à Utilisation des connexions (FireDAC)
Cette rubrique explique comment gérer les erreurs de base de données avec FireDAC.
Sommaire
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 :
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, 'Berlin']);
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;
- définition du gestionnaire d'événement TFDQuery.OnExecuteError pour gérer les erreurs spécifiques à Array DML.
- définition du gestionnaire d'événement TFDQuery.OnUpdateError pour gérer les erreurs de validation des mises à jour.
- définition des gestionnaires d'événement TFDConnection.OnLost, OnRestored, OnRecover pour gérer les erreurs de connexion perdue.
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 :
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
- Récupération d'une connexion
- Exécution des commandes
- Espace de nommage FireDAC.Stan.Error
- Evénement TFDCustomConnection.OnError
- Evénement TFDAdaptedDataSet.OnError