【问题标题】:DataSetProvider error?数据集提供程序错误?
【发布时间】: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


    【解决方案1】:

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

    查看以下链接http://www.drbob42.com/examines/examinC0.htm

    【讨论】:

    • 感谢您的回复威尔;但是我们最近改变了捕获错误和插入的方法,所以一切都在复杂性方面有所降低(谢天谢地!)。但是,如果我再次遇到它,仍然很高兴知道可能的解决方案,所以感谢您的链接!
    猜你喜欢
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 2012-08-12
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多