Gestion des erreurs de mise à jour en mémoire cache
Remonter à Utilisation du BDE pour placer en mémoire cache les mises à jour - Index
Remarque : Le moteur de base de données Borland (BDE, Borland Database Engine) a été déprécié. Il ne sera donc pas amélioré. Par exemple, le BDE ne prendra jamais en charge Unicode. Vous ne devriez pas entreprendre de nouveaux développements avec BDE. Prévoyez plutôt de migrer vos applications de bases de données existantes de BDE vers dbExpress.
Quand il essaie d'appliquer les mises à jour, le moteur de bases de données Borland (BDE) recherche les conflits de mise à jour utilisateur et autres conditions, et il signale les erreurs éventuelles. L'événement DBTables.OnUpdateError du composant ensemble de données vous permet de capturer les erreurs et d'y répondre. Il est bon de créer un gestionnaire pour cet événement si vous utilisez les mises à jour en mémoire cache. Si vous ne le faites pas et qu'une erreur survient, toute l'opération de mise à jour échoue.
Voici le code squelette d'un gestionnaire d'événement OnUpdateError :
procedure TForm1.DataSetUpdateError(DataSet: TDataSet; E: EDatabaseError;
UpdateKind : TUpdateKind; var UpdateAction: TUpdateAction);
begin
{ ... gestion des erreurs de mise à jour ici... }
end;
void __fastcall TForm1::DataSetUpdateError(TDataSet *DataSet,
EDatabaseError *E, TUpdateKind UpdateKind, TUpdateAction &UpdateAction)
{
// Répondre aux erreurs ici...
}
DataSet référence l'ensemble de données auquel les mises à jour sont appliquées. Vous pouvez utiliser cet ensemble de données pour accéder aux nouvelles et anciennes valeurs durant la gestion d'erreur. Les valeurs originales des champs de chaque enregistrement sont stockées dans une propriété TField en lecture seule appelée OldValue. Les valeurs modifiées sont stockées dans la propriété TField analogue NewValue. Ces valeurs constituent la seule possibilité d'inspecter et de modifier les valeurs de mise à jour dans le gestionnaire d'événement.
Avertissement : N'appelez aucune méthode d'ensemble de données susceptible de changer l'enregistrement en cours (comme Next et Prior). Cela ferait entrer le gestionnaire d'événement dans une boucle sans fin.
Le paramètre E est habituellement du type EDBEngineError. Dans ce type d'exception, vous pouvez extraire un message d'erreur que vous pouvez afficher aux utilisateurs dans votre gestionnaire d'erreur. Par exemple, le code suivant affiche le message d'erreur dans l'intitulé d'une boîte de dialogue :
ErrorLabel.Caption := E.Message;
ErrorLabel->Caption = E->Message;
Ce paramètre est aussi utile pour déterminer la cause exacte de l'erreur de mise à jour. Vous pouvez récupérer les codes d'erreur spécifiques depuis EDBEngineError, et prendre les mesures appropriées.
Le paramètre UpdateKind décrit le type de mise à jour qui a généré l'erreur. Sauf si votre gestionnaire d'erreur doit entreprendre des actions spéciales selon le type d'erreur rapporté, vous ne l'utiliserez sans doute pas.
Le tableau suivant présente les valeurs possibles de UpdateKind :
Valeurs UpdateKind :
Valeur | Signification |
---|---|
ukModify |
L'édition d'un enregistrement existant a généré une erreur. |
ukInsert |
L'insertion d'un enregistrement a généré une erreur. |
ukDelete |
La suppression d'un enregistrement existant a généré une erreur. |
UpdateAction
indique au BDE comment continuer le processus de mise à jour à la sortie de votre gestionnaire d'événement. Au premier appel de votre gestionnaire d'erreur de mise à jour, la valeur de ce paramètre est toujours définie à uaFail. Selon la condition d'erreur de l'enregistrement qui a généré l'erreur et ce que vous faites pour la corriger, vous définissez généralement UpdateAction
à une valeur différente avant de quitter le gestionnaire :
- Si votre gestionnaire d'erreur peut corriger la condition d'erreur qui a provoqué son intervention, définissez
UpdateAction
à l'action appropriée à entreprendre en sortie. Pour les conditions d'erreur que vous corrigez, définissezUpdateAction
à uaRetry pour appliquer de nouveau la mise à jour de l'enregistrement. - Si vous utilisez la valeur uaSkip, la mise à jour de la ligne qui a provoqué l'erreur est ignorée et la mise à jour de l'enregistrement reste dans le cache quand toutes les autres mises à jour sont terminées.
- uaFail et uaAbort mettent toutes deux un terme à toute l'opération de mise à jour. uaFail déclenche une exception et affiche un message d'erreur. uaAbort déclenche une exception silencieuse (sans afficher de message d'erreur).
Le code suivant montre comment un gestionnaire d'événement OnUpdateError vérifie si l'erreur de mise à jour est liée à une violation de clé, et dans ce cas définit le paramètre UpdateAction
à uaSkip :
{ Ajouter 'Bde' à votre clause uses pour cet exemple }
if (E is EDBEngineError) then
with EDBEngineError(E) do begin
if Errors[ErrorCount - 1].ErrorCode = DBIERR_KEYVIOL then
UpdateAction := uaSkip { violation de clé, ignorer cet enregistrement }
else
UpdateAction := uaAbort; { ignore ce qui ne va pas, annule la mise à jour }
end;
// incluez BDE.hpp dans votre fichier d'unité pour cet exemple
void __fastcall TForm1::DataSetUpdateError(TDataSet *DataSet,
EDatabaseError *E, TUpdateKind UpdateKind, TUpdateAction &UpdateAction)
{
UpdateAction = uaFail // initialisation pour échec de mise à jour
if (E->ClassNameIs("EDBEngineError"))
{
EDBEngineError *pDBE = (EDBEngineError *)E;
if (pDBE->Errors[pDBE->ErrorCount - 1]->ErrorCode == DBIERR_KEYVIOL)
UpdateAction = uaSkip; // violation de clé, ignorer cet enregistrement
}
}
Remarque : Si une erreur survient durant l'application des mises à jour en mémoire cache, une exception est déclenchée et un message d'erreur est affiché. A moins que ApplyUpdates ne soit appelé dans une construction try...except, un message d'erreur affiché depuis votre gestionnaire d'événement OnUpdateError peut provoquer un double affichage par votre application du même message d'erreur. Pour éviter la duplication du message d'erreur, définissez
UpdateAction
à uaAbort pour désactiver l'affichage des messages d'erreur générés par le système.