2012-04-10 4 views
3

J'ai une ancienne application Delphi 7 qui charge les données d'une table de base de données, effectue de nombreuses opérations et calculs et enfin écrit des enregistrements dans une table de destination.TClientDataset Erreur ApplyUpdates à cause de la contrainte de la table de base de données

Cette ancienne application appelle ApplyUpdates tous les 500 enregistrements, pour des raisons de performances.

Le problème est que, parfois, dans ce groupe d'enregistrements se trouve un qui déclenchera une contrainte de base de données; Delphi déclenche une exception sur ApplyUpdates.

Mon problème est que je ne sais pas quel enregistrement est responsable pour cette exception. Il y a 500 candidats!

Est-il possible de demander à TClientDataset quel est l'enregistrement incriminé?

Je ne veux pas ApplyUpdates pour chaque enregistrement ajouté pour les problèmes de vitesse.

+0

Peut être le meilleur moyen consiste à applyUpdates foreach seulement après une exception, sur les 500 enregistrements. – philnext

+0

@philnext Je ne comprends pas ce que tu veux dire. – Jako

+0

ApplyUpdates sur 500 enregistrements, si tout est OK faites-le pour les 500 prochaines, si vous avez une exception, ApplyUpdates pour chacun de 500 dossiers jusqu'à ce que vous ayez une exception, traitez-le et continuez ... – philnext

Répondre

7

Je pense que vous pouvez essayer d'implémenter l'événement OnReconcileError qui est déclenché une fois pour chaque enregistrement qui n'a pas pu être appliqué à l'ensemble de données. Donc, je voudrais essayer le code suivant, raSkip signifie ici pour passer l'enregistrement en cours:

procedure TForm1.ClientDataSet1ReconcileError(DataSet: TCustomClientDataSet; 
    E: EReconcileError; UpdateKind: TUpdateKind; var Action: TReconcileAction); 
begin 
    Action := raSkip; 
    ShowMessage('The record with ID = ' + DataSet.FieldByName('ID').AsString + 
    ' couldn''t be updated!' + sLineBreak + E.Context); 
end; 

Mais s'il vous plaît noter, je ne l'ai jamais essayé cela avant et je ne sais pas si ce n'est pas trop tard pour ignorer les erreurs élevé par la fonction ApplyUpdates. Oublié de mentionner, essayez d'utiliser le paramètre passé DataSet qui doit contenir l'enregistrement qui n'a pas pu être mis à jour; ce pourrait être le moyen de déterminer quel enregistrement a causé le problème.

Et here est décrit les mises à jour appliquant le flux de travail. L'implémentation OnReconcileError vous donnera accès à l'enregistrement et aux données qui sont responsables de l'exception

+0

Mais [[quelque chose]] (http://docwiki.embarcadero.com/RADStudio/XE2/fr/Applying_Updates) me dit que cela pourrait fonctionner, voir le paragraphe qu'est-ce que le ['ApplyUpdates'] (http://docwiki.embarcadero.com/Libraries/en/Datasnap.DBClient.TCustomClientDataSet.ApplyUpdates) do. – TLama

+0

J'ai étendu mon code non testé avec la façon dont je pense pourrait être possible d'afficher le message avec des informations sur l'enregistrement qui n'a pas pu être mis à jour avec l'erreur décrivant pourquoi. – TLama

+0

Je pense que c'est ça!Et merci pour le lien vers les docs – Jako

2

Un facile à accomplir est d'ajouter une "boîte de dialogue d'erreur de réconciliation". Il se trouve dans la boîte de dialogue "Nouveaux éléments" qui est affichée par Fichier | Nouveau | Autre. Une fois que vous l'avez ajouté à votre projet et utilisé dans le formulaire avec le clientdataset. Le code suivant montre comment il est appelé.

procedure TForm1.ClientDataSetReconcileError(DataSet: TCustomClientDataSet; 
    E: EReconcileError; UpdateKind: TUpdateKind; 
    var Action: TReconcileAction); 
begin 
    Action := HandleReconcileError(DataSet, UpdateKind, E); 
end; 

Il s'affichera à la place de la boîte de dialogue d'exception. Cela vous permettra d'afficher les données incriminées et de sélectionner comment vous voulez procéder. Cela fait plus de 5 ans que je l'ai utilisé pour la dernière fois, j'espère que je n'ai pas oublié quelques détails.

+0

Votre réponse est un peu similaire à TLama. Merci j'ai mis en doute – Jako

Questions connexes