我的软件中有以下DBX结构:
TSQLDataSet -> TDataSetProvider -> TClientDataSet
我的TClientDataSet中的一个字段将属性Required设置为false,因为此字段会根据数据库(Firebird)上的触发器和生成器自动递增。
但是,在配置了不需要此字段的TSQLDataSet和TClientDataSet之后,当我尝试从我的TClientDataSet中读取此字段时,我得到了非常奇怪的结果。我怀疑我可能需要做一些额外的操作来强制我的TClientDataSet在这种情况下获取该字段的值。
我在这里缺少什么?
提前致谢。
修改
Required属性的帮助文件说明了这一点,但我不太明白它希望我做什么。
描述
指定字段的非空值是否为 需要。
使用“必需”查明字段是否需要值或字段 可以是空白的。
如果使用“字段”编辑器创建字段,则会设置此属性 基于底层表。将Required设置为true的应用程序 对于必须具有值的字段(例如,密码或部分 数字),但基础表不需要 field,必须编写一个OnValidate事件处理程序来强制执行该属性。
当Required属性反映底层的属性时 数据库表,尝试发布应用空值会导致异常 待提高。将Required属性设置为true的应用程序 底层表不需要该字段,应该提出一个 OnValidate事件中空值的EDatabaseError异常 处理程序,以达到相同的结果。
编辑2
忘记提及:在TDataSetProvider和TClientDataSet之间,有一个DataSnap层(TClientDataSet连接是用DataSnap驱动程序建立的)。
编辑3
我用这个DataSnap设置创建了一个小测试用例,它运行得很好。该项目是遗留的,凌乱的,我想我要么在某个地方配置了一个模糊的选项,这个选项正在咬我,或者我偶然发现了一个DataSnap错误。
答案 0 :(得分:0)
Haole,插入后你试过TClientDataset.RefreshRecord吗?甚至TClientDataset.Refresh?
拥有生成器,您甚至可以在select gen_id(generator,1) from RDB$Database
之类的查询中提前获取生成器(在调用ApplyUpdates之前)(它来自内存,此处没有Firebird进行测试)并提前填充PK字段。
或者更好的是,创建一个只有所需查询配置的空项目,并尝试在TDBGrid中查看该数据。如果这个问题仍然存在,可能你的FB安装有一些组件损坏(甚至是Delphi安装)
答案 1 :(得分:0)
似乎问题是一个过时的字段被读作INTEGER而且它在数据库中是一个SMALLINT。
这个问题很难调试,这个问题很容易引起误解。感谢所有帮我调试的人。