2016-10-27 1 views
0

J'ai un projet dans Delphi 7 qui utilise une base de données dans MySQL pour stocker de la configuration. Chaque fois que je change une config, un bouton "Enregistrer" est activé. La procédure OnClick dans ce bouton appelle TADOQuery.Edit, Select les champs avec la propriété SQL, TADOQuery.Open et définit les différents FieldsByName. À la fin, il TADOQuery.Post la configuration et Requery il.Comment savoir si ADOQuery.Post va changer la base de données?

Cela fonctionne bien, uniquement si au moins un de ces champs est réellement modifié.

Si, par exemple, je vérifie une case à cocher (à l'origine non cochée), puis la désélectionner à nouveau, le bouton Enregistrer sera activé, mais les données réelles dans la base de données ne changeront pas. Dans ce cas, lorsque j'appelle Post, une exception est déclenchée.

J'ai vu this question qui résoudrait mon problème, en vérifiant s'il y a eu une modification, mais dès que j'ai défini le premier champ, la propriété Modified de TADOQuery devient vraie, invalidant cette solution.

Une autre option consisterait à vérifier, avant de définir le champ, s'il change réellement, de définir un drapeau pour, à la fin, l'afficher réellement ou non. Mais il y a des centaines de champs à faire, ce qui sera plutôt ennuyeux à faire. Une troisième alternative que je pensais est de créer un nouveau champ dans la base de données avec un datastamp "Last Modified", qui oblige à toujours avoir au moins une modification, mais je préfère ne pas jouer avec la base de données existante.

Y at-il un autre moyen de savoir si un TADOQuery.Post va déclencher une exception, car aucune donnée n'a vraiment changé? Comment puis-je résoudre ce problème? Ou y a-t-il une solution de contournement simple pour cela?

La variable ADOQuery est créée dynamiquement dans la routine du bouton Enregistrer (et libérée à la fin).

+0

J'ai travaillé avec CBuilder ++ il y a longtemps, et je « pense » qu'il y avait quelque chose appelé OldValue et NewValue lorsque vous modifiez et de modifier un jeu d'enregistrements, mais je ne suis vraiment pas sûr. Il y a très très longtemps. – McNets

+0

Peut-être que: http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/FR/html/delphivclwin32/DB_TField_OldValue.html – McNets

+0

Humm ... cela semble bien, mais pour un champ, il échoue l'accès à oldValue. Je ne sais pas pourquoi. Pour l'instant, je mets le 'post' dans un try..except et vérifie le message d'exception si c'est le message pour quand cela arrive. Cela ne fonctionnera évidemment pas lorsque l'utilisateur utilisera une langue différente dans le système, mais c'est ce que j'ai obtenu pour l'instant ... – ricardomenzer

Répondre

0

Ce serait une bonne approche d'utiliser CheckBrowseMode() au lieu de Post().

ADOQuery1.CheckBrowseMode 

CheckBrowseMode(): automatiquement les messages ou annule les modifications de données en cas de changement de disques actifs.

Vous pouvez en savoir plus sur ici: http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/DB_TDataSet_CheckBrowseMode.html

+0

Cela n'a pas fonctionné. La même exception élevée avec 'Post' est soulevée avec cette méthode. – ricardomenzer