是否可以同时使用db-aware和non-aware组件来插入/更新数据库?

时间:2013-05-20 23:49:23

标签: database delphi

我有一个典型的[Delphi]设置用于连接到外部数据库 - 连接到Table,DataSetProvider,ClientDataSet和DataSource的Connection组件。我可以使用以下代码成功插入新记录:

CDS.Insert;
CDS['advisor_id']:=1;
CDS['some_field']:=edtSomeField.Text;
//etc.
CDS.Post;

但是,我还有一个DBLookupComboBox,其DataSource连接到CDS,ListSource等设置为列出顾问名称并将它们转换为advisor_id字段的值。它显示了它应该显示的内容。我的设置方式并没有错。

如果我注释掉CDS['advisor_id']:=1;并启用DBLookupComboBox,假设它将提供字段的值,我会在CDS.Insert行之后收到错误消息。该消息告诉我“Field advisor_id必须有值。” (请注意,如果我将上面的两个赋值行强行删除,则错误消息将告诉我“字段some_field必须具有值。”)

是否可以通过这种方式混合使用db-aware和非db-aware的组件? (或者我应该只加载带有顾问程序名称的ComboBox,并在用户插入或更新记录时将它们转换为advisor_id值?)

1 个答案:

答案 0 :(得分:0)

不确定为什么这会被投票但......看起来我的问题的答案是“不”。我想,也许,点击DBLookupComboBox会改变数据集的状态。最终,此状态更改与我对Insert的调用结合产生错误。如果我的理解混乱,请随意添加澄清评论。

目前我认为我的问题是通过使用DBLookupComboBox与ListSource连接来解决的(因此显示和选择了值),但没有连接到DataSource(因此没有db状态更改)。我现在有了这段代码:

//note that I am omitting error checking and validation code here ...
CDS.Insert;
CDS['advisor_id']:=DBLookupComboBox.KeyValue;
CDS['someField']:=edtSomeField.Text;
//etc.
CDS.Post;