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).
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
Peut-être que: http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/FR/html/delphivclwin32/DB_TField_OldValue.html – McNets
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