问题很简单:我的Firebird 2.1.4数据库中有触发器和生成器,可以在每个插件上自动增加列。
系统架构如下:
TSQLConnection > TSQLDataSet -> TDataSetProvider -> (DataSnap) -> TClientDataSet -> TDataSource
但是,如果我尝试在我的TClientDataSet中发布一些缺少列的更新,Delphi会抱怨这样:
Field 'XXX' must have a value
如果我使用缺少这些字段的SQL插入语句,则插入行,触发器和生成器按预期工作。
如何让Delphi(DBX,DataSnap等)了解我正在尝试做什么(并允许它)?
修改
根据@ mj2008的评论提供更多信息:使用CloneCursor方法在运行时创建此TClientDataSet。在调用CloneCursor之后,我将此字段的Required属性设置为False。它对这个问题没有帮助。例如:
myCds.CloneCursor(otherCds, True);
myCds.FieldByName('XXX').Required := False;
这会导致抛出相同的异常。
答案 0 :(得分:2)
我还必须将TSQLDataset的Required属性设置为False。这解决了这个问题。
答案 1 :(得分:0)
仅补充:当您执行TClientDataset设置时,更新最终会发送到数据访问组件,在本例中为TSQLDataset,因此即使TClientdataset不需要字段值,如果数据访问组件需要它,则会引发错误。
即使数据来自TADODataset,TIbDataset或其他任何内容,它也会相同。