2016-10-27 6 views
0

У меня есть проект в 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 (и в конце).

+0

Я работал с CBuilder ++ давно, и я «думаю, что» существует нечто, называемое OldValue и NewValue при редактировании и изменить набор записей, но я действительно не конечно. Давным-давно. – McNets

+0

Возможно, это: http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/DB_TField_OldValue.html – McNets

+0

Humm ... это кажется хорошим, но для одного поля он не может получить доступ к oldValue. Я не знаю почему. На данный момент я помещаю 'post' в try..except и проверяю сообщение об исключении, если это messsage, когда это происходит. Очевидно, что он не работает, когда пользователь использует другой язык в системе, но это то, что я получил сейчас ... – ricardomenzer

ответ

0

Было бы неплохо использовать CheckBrowseMode() вместо Post().

ADOQuery1.CheckBrowseMode 

CheckBrowseMode(): Автоматически сообщение или отменяет изменения данных, когда активные записи изменений.

Вы можете прочитать больше о здесь: http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/DB_TDataSet_CheckBrowseMode.html

+0

Это не сработало. Такое же исключение, созданное с помощью 'Post', создается с помощью этого метода. – ricardomenzer