【发布时间】:2013-02-22 19:31:35
【问题描述】:
我在主/详细模式下的数据集有问题。
我正在使用 Delphi XE 和更新 1、DBExpress 和 Firebird 2.5.2 我在两个表 (CDS) 之间有一个主/详细关系,定义 具有主源/主域属性。
我的问题是,当我删除详细数据集中的所有记录并在编辑主 ClientDataset 后,当我在 Detail ClientDataSet 中调用 CancelUpdates 方法时,我收到 “密钥违规” 异常。
这个问题只发生在详细数据集为空的情况下。
有人知道可能是什么问题吗?
已编辑: 人们,我在我的框架中解决了“密钥违规”的问题。 不确定是什么导致了问题,所以我暂时隔离了异常。
在同样的结构中,还有另一个问题,在这种情况下似乎是一个 Bug 的 DBExpress。
在下面的链接中,我创建了一个示例来模拟问题。
http://www.4shared.com/zip/gmT7GVPf/MestreDetalheBug.html
如何模拟问题:
1) 选择主记录;
2)在网格详细信息中,删除所有记录,但不保存。仅由 DbNavegador 删除。
3)继续网格主并更改主记录的任何值。您将看到记录详细信息网格重新出现详细信息。
仅当 DataSet Detail 为空时才会出现此问题。
我有一个框架来维护对缓存在工作台上的记录的所有更改,并且仅在用户单击“保存”按钮时才有效。找了一阵子的解决办法,就是在明细记录被删除的时候,已经在数据库中生效了。
有什么帮助吗?
【问题讨论】:
-
一些问题:master/detail 是在提供者之前还是之后完成的(嵌套客户端数据集)? drop 你的意思是 delete 所有主记录的所有详细记录?您是否在编辑主记录时更改了关键主字段的值?通过取消明细的更新,您想保留主记录中的编辑,但取回已删除的记录?
-
Jachguate,回答你的问题。
-
@jachguate,回答你的问题。 1)我打开主数据集,然后打开详细数据集。 2)在我的情况下,我只删除所有详细记录,执行 CancelUpdates 时只返回删除的详细记录。 3)我没有更改主值,关键值对用户不可见。 4) 确切地说,在 CancelUpdates 之后,我的意图是只返回详细数据集记录。该问题仅发生在 DetailDataSet 并且仅当它为空时。谢谢
-
我的第一个问题没有回答。如果您编辑问题并添加显示组件关系的图表或图片会更好,不仅包括客户端数据集,还包括提供者或提供者和基础数据集。我也不清楚你是删除所有主记录的所有记录,还是只删除活动主记录的所有记录。
-
@jachguate,很抱歉耽搁了时间,为您提供了一个示例,以便您更好地了解。我编辑了正文,解释得更好。感谢您的帮助。
标签: delphi key constraints