2016-10-27 39 views
0

我有一个Delphi 7中的项目,它使用MySQL中的数据库来存储一些配置。 每当我改变一个配置,一个“保存”按钮启用。此按钮中的OnClick过程调用TADOQuery.EditSelect字段的SQL属性,TADOQuery.Open并设置各种FieldsByName。最后,它TADOQuery.Post的配置和Requery它。如何知道ADOQuery.Post是否会更改数据库?

只有至少其中一个字段实际发生了更改,才能正常工作。例如,如果我检查checkBox(最初未选中),然后再次取消选中,保存按钮将启用,但数据库中的实际数据不会更改。在这种情况下,当我拨打Post时,会引发异常。

我看到this问题可以解决我的问题,检查是否存在ara任何修改,但只要我设置第一个字段,TADOQuery的Modified属性就会变为true,从而使此解决方案失效。

另一种选择是在设置字段之前检查它是否会真正发生变化,最后设置一个标志实际发布与否。但是,有数百个领域需要这样做,这将是非常无聊的事情。

我认为的第三种方法是在数据库中用“Last Modified”日期戳记创建一个新字段,它强制始终至少有一个修改,但我宁愿不要混淆现有数据库。

是否有任何其他方式知道TADOQuery.Post是否会触发异常,因为没有数据真的发生了变化?我怎么解决这个问题?或者有一个简单的解决方法呢?

ADOQuery变量是在保存按钮的例程中动态创建的(并且在最后是free'd)。

+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中,并检查异常消息是否是发生这种情况时的消息。当用户在系统中使用不同的语言时,它显然不起作用,但这是我现在得到的... – ricardomenzer

回答