【发布时间】:2011-12-19 15:07:11
【问题描述】:
我有 DBGrid->DataSource->ClientDataSet->DataSetProvider->CustomDataSet。
(最后我使用我自己的自定义数据集,因为我们没有直接连接到数据库......我们有一个指向特定类型的指针,我们可以随时更改。)
无论哪种方式,数据集和客户端数据集都工作得很好。 我最近遇到了一个问题。
我在数据库中有一个名为 ID 的主键。
当我执行多个新插入时,我通过调用 ClientDataSet->Append() 来处理它,然后将每个新行的 ID 值设置为最后一行的倒数 + 1。
(即:如果当前有 935 行,则新的行 ID 将为 -936)
这样,我修复了在没有设置 ID 时发生的 Key Violation 错误,因为它是主键,并且在我保存时插入了 DB ID。
现在,我的问题出在哪里:
我已经在数据库中有一个空白行。
我在数据库本身中设置了一个唯一键,因此它不能包含包含相同数据的两行(因此不能有两个空白行等)。
我的数据库中已经有 935 行,而第 935 行是空白的。
我插入 3 个新行,然后按保存。
对于每一个,我在 OnUpdateError 回调中收到一个错误,说“重复行”。
这意味着我在 ClientDataSet 中有第 936、937 和 938 行,但没有我的 CustomDataSet 或 DB,因为它们有错误,所以没有保存任何内容。
如果我删除第 937 行,UI 端的一切看起来都很好。
但是,如果我再次保存,错误返回给我的行(并且存储在 DataXML 文件中)是第 936 和 938 行。
当我从 ClientDataSet 中删除 937 行时,DataSetProvider 是否应该自行更新? 我知道第 938 行是错误的……但它不再存在。
如果 937 被删除,则 938 变为 937。
我一直在寻找这方面的帮助,但似乎没有任何解决办法。
【问题讨论】:
标签: delphi dataset delphi-2010