DataSetProvider错误?

时间:2011-11-01 15:59:54

标签: delphi dataset delphi-2010

我有 DBGrid-> DataSource-> ClientDataSet-> DataSetProvider-> CustomDataSet。

(我最后使用自己的自定义数据集,因为我们没有与数据库的直接连接......我们有一个指向某个类型的指针,我们可以随时更改它。)

无论哪种方式,数据集和clientdataset工作得很好。 我最近遇到了一个问题。

我在数据库中有一个名为ID的主键。 当我执行多个NEW插入时,我通过调用ClientDataSet->Append()来处理它,然后将每个新行的ID值设置为最后一行+ 1的倒数。 (IE:如果当前有935行,则新行ID将为-936)
这样,我修复了由于它是主键而没有设置ID时发生的密钥冲突错误,并且在保存时插入了DB ID。

现在,问题出在哪里:
我的数据库中已经有一个空白行 我在数据库本身设置了一个唯一键,因此它不能包含两行包含相同数据的行(因此不能有两行空行等)。

我已经在DB中有935行,而行935是空白的 我插入3个新行,然后按保存。
对于每一个,我在OnUpdateError回调中得到一个错误,说“Duplicate Row”。

这意味着我在ClientDataSet中有行936,937和938,但不是我的CustomDataSet或DB,因为没有保存,因为它们是错误的。

如果删除第937行,则UI端的所有内容都可以正常显示 但是,如果我再次保存,那么错误返回给我的行(以及存储在DataXML文件中的行)是第936行和第938行。

当我从ClientDataSet中删除937行时,DataSetProvider不应该自行更新吗? 我知道第938行是错误的...但它不再存在了。

如果937被删除,则938变为937.

我一直在寻找这方面的帮助,但似乎没有解决它。

1 个答案:

答案 0 :(得分:1)

我假设您在数据库中使用autoinc字段。我最近发现可以保存新行而无需为键字段应用值。在clientdataset和customdataset中,您必须删除keyfield的必需标志,并删除datasetprovider的InUpdate标志。我想这会解决你的问题。

请参阅以下链接http://www.drbob42.com/examines/examinC0.htm