2016-07-03 2 views
5

Mon projet Delphi contient des données d'accès TAdoQuery sur un serveur MS Sql Server 2014 et TClientDataSet qui reçoit les données AdoQuery via un TDataSetProvider. Ceci est créé à partir d'un modèle de projet que j'ai mis en place.TClientDataSet.ApplyUpdates() n'applique pas les mises à jour

Normalement, j'ai trouvé que cette configuration fonctionnait correctement, mais avec ce projet particulier, j'ai un problème: ApplyUpdates() échoue silencieusement et les données Sql Server ne sont pas mises à jour. Dans mon projet de débogage dépouillé, le seul code je, à l'exception d'un gestionnaire bouton-clic, qui appelle, est la suivante:

procedure TForm1.ApplyUpdates; 
var 
    Errors : Integer; 
begin 
    Errors := ClientDataSet1.ApplyUpdates(0); 
    Caption := IntToStr(Errors) + '/' + IntToStr(ClientDataSet1.ChangeCount); 
end; 

Après cette exécute, la légende du formulaire doit être 0/0 bien sûr, mais ce qu'il dit réellement est 0/1. Donc, sur le visage de celui-ci, aucune erreur ne s'est produite mais les CDS ChangeCount n'a pas été remis à zéro comme il se doit. Mon q est, comment ApplyUpdates ne retourner aucune erreur, mais le jeu de données du serveur n'est pas mis à jour.

Fwiw, j'ai ajouté l'affichage ChangeCount dans le cadre de mon effort pour déboguer le problème. Mais je crains de ne pas avoir été capable de suivre ce qui est censé se passer dans les détails de la "conversation" entre DataSetProvider et son DataSet pour appliquer les mises à jour sur le serveur.

+1

Avez-vous ajouté du code pour le gestionnaire d'erreurs OnReconcileError? – mjn

Répondre

5

J'ai récemment rencontré ce problème sur un projet rapide que j'ai corrigé sans la précaution de définir un gestionnaire OnReconcileError, comme demandé par @mjn. Une fois que j'ai configuré le gestionnaire OnReconcileError, il était évident que le problème était que TSqlResolver du fournisseur n'était pas capable d'identifier la ligne à mettre à jour. Iirc, le message dans le formulaire contextuel ReconcileError était des mots à l'effet de "Impossible de localiser l'enregistrement.No clé spécifiée."

Donc, la première chose que j'ai essayé était d'inclure dans mes CDS AfterOpen:

CDS1.Fields[0].ProviderFlags := [pfInKey]; 

(CDS1.Fields [0] est le champ PK du jeu de données)

Contrairement à mes attentes, ça n'a pas arrangé ça. Après m'être gratté la tête pendant un moment, j'ai regardé attentivement le serveur et découvert que la table recréée récemment que j'utilisais n'avait pas d'index de clé primaire.

Une fois que j'ai créé l'index de clé primaire sur le serveur, le problème ApplyUpdates a disparu. Cependant, ce qui me laisse perplexe à propos de ceci est que, provoqué par votre q, j'ai laissé tomber l'index de clé primaire sur ma table de serveur et le problème n'a pas commencé à se produire à nouveau (!). Je suppose que cela est dû à une sorte d'effet de cache sur ma machine mais je ne veux pas vraiment le redémarrer maintenant pour enquêter.