2

我的软件中有以下 DBX 结构:

TSQLDataSet -> TDataSetProvider -> TClientDataSet

我的 TClientDataSet 中的一个字段将Required 属性设置为false,因为该字段会根据数据库(Firebird)上的触发器和生成器自动递增。

但是,在配置了不需要此字段的 TSQLDataSet 和 TClientDataSet 之后,当我尝试从 TClientDataSet 中读取此字段时,我得到了非常奇怪的结果。我怀疑我可能需要做一些额外的事情来强制我的 TClientDataSet 在这种情况下获取该字段的值。

我在这里想念什么?

提前致谢。

编辑

Required 属性的帮助文件说明了这一点,但我不太明白它要我做什么。

描述

指定是否需要字段的非空值。

使用必填来确定字段是否需要值或该字段是否可以为空。

如果字段是使用字段编辑器创建的,则此属性是根据基础表设置的。对于必须具有值(例如,密码或部件号)但基础表不需要该字段的字段,将 Required 设置为 true 的应用程序必须编写 OnValidate 事件处理程序以强制执行该属性。

当Required 属性反映基础数据库表的属性时,尝试发布应用空值会导致引发异常。当基础表不需要该字段时,将 Required 属性设置为 true 的应用程序应在 OnValidate 事件处理程序中针对空值引发 EDatabaseError 异常,以实现相同的结果。

编辑 2

忘了说:在 TDataSetProvider 和 TClientDataSet 之间,有一个 DataSnap 层(TClientDataSet 连接是通过 DataSnap 驱动建立的)。

编辑 3

我用这个 DataSnap 设置创建了一个小测试用例,它运行良好。该项目是遗留的,混乱的,我想要么我在某个地方配置了一个模糊的选项,这让我很痛苦,要么我偶然发现了一个 DataSnap 错误。

4

2 回答 2

0

浩乐,插入后有没有试过TClientDataset.RefreshRecord?甚至 TClientDataset.Refresh?有了生成器,您甚至可以在查询中(在调用 ApplyUpdates 之前)提前获取生成器select gen_id(generator,1) from RDB$Database(它来自内存,这里没有要测试的 Firebird)并提前填写 PK 字段。

编辑:似乎这是一个 heisenbug。我会尝试删除组件并从头开始重新配置它们(这意味着:删除后,保存并关闭 Delphi)。

或者更好的是,创建一个只包含所需查询配置的空项目,并尝试在 TDBGrid 中查看该数据。如果这个问题仍然存在,可能你的 FB 安装有一些组件损坏(甚至是 Delphi 安装)

于 2012-01-27T18:51:03.957 回答
0

似乎问题是一个过时的字段被读取为 INTEGER 并且它是数据库中的 SMALLINT。

这个问题很难调试,而且这个问题具有误导性。感谢所有帮助我调试的人。

于 2012-01-30T12:18:35.537 回答