如何从具有必需属性设置为false的字段中检索信息?

时间:2012-01-27 18:46:41

标签: delphi firebird datasnap tclientdataset dbx

我的软件中有以下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错误。

2 个答案:

答案 0 :(得分:0)

Haole,插入后你试过TClientDataset.RefreshRecord吗?甚至TClientDataset.Refresh? 拥有生成器,您甚至可以在select gen_id(generator,1) from RDB$Database之类的查询中提前获取生成器(在调用ApplyUpdates之前)(它来自内存,此处没有Firebird进行测试)并提前填充PK字段。

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

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

答案 1 :(得分:0)

似乎问题是一个过时的字段被读作INTEGER而且它在数据库中是一个SMALLINT。

这个问题很难调试,这个问题很容易引起误解。感谢所有帮我调试的人。