У меня есть проект в Delphi 7, который использует базу данных в MySQL для хранения некоторой конфигурации. Когда я меняю конфигурацию, кнопка «Сохранить» включена. Процедура OnClick в этой кнопке вызывает TADOQuery.Edit
, Select
поля с SQL
, TADOQuery.Open
и установить различные FieldsByName
. В конце концов, это TADOQuery.Post
конфигурации и Requery
это.Как узнать, изменит ли ADOQuery.Post базу данных?
Это хорошо работает, только если по крайней мере одно из этих полей действительно изменено.
Если, например, я проверяю checkbox (первоначально не установленный), а затем снова проверяет его, кнопка «Сохранить» включается, но фактические данные в базе данных не изменяются. В этом случае, когда я вызываю Post
, возникает Исключение.
Я видел this вопрос, который бы разрешил мою проблему, проверяя, есть ли какая-либо модификация, но как только я установил первое поле, свойство TADOQuery Modified
станет истинным, недействительным это решение.
Другой вариант - проверить, прежде чем устанавливать поле, если оно действительно изменится, установив флаг в конце, фактически опубликуйте его или нет. Но для этого есть сотни полей, которые будут довольно скучными.
Третья альтернатива, я думал, это создать новое поле в базе данных с «последней модификацией» datestamp, которая вынуждает всегда иметь хотя бы одну модификацию, но я предпочитаю не вмешиваться в существующую базу данных.
Есть ли другой способ узнать, будет ли TADOQuery.Post инициировать исключение, потому что данные действительно не изменились? Как я могу решить эту проблему? Или есть простой способ обхода?
Переменная ADOQuery динамически создается в рутине кнопки Save (и в конце).
Я работал с CBuilder ++ давно, и я «думаю, что» существует нечто, называемое OldValue и NewValue при редактировании и изменить набор записей, но я действительно не конечно. Давным-давно. – McNets
Возможно, это: http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/DB_TField_OldValue.html – McNets
Humm ... это кажется хорошим, но для одного поля он не может получить доступ к oldValue. Я не знаю почему. На данный момент я помещаю 'post' в try..except и проверяю сообщение об исключении, если это messsage, когда это происходит. Очевидно, что он не работает, когда пользователь использует другой язык в системе, но это то, что я получил сейчас ... – ricardomenzer