我有 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.
我一直在寻找这方面的帮助,但似乎没有解决它。
答案 0 :(得分:1)
我假设您在数据库中使用autoinc字段。我最近发现可以保存新行而无需为键字段应用值。在clientdataset和customdataset中,您必须删除keyfield的必需标志,并删除datasetprovider的InUpdate标志。我想这会解决你的问题。