使用带有自动增量链接的嵌套ClientDataSet插入记录

时间:2013-05-18 05:26:50

标签: mysql database delphi

我正在使用MySQL数据库自学Delphi数据库编程。我正在尝试从嵌套的ClientDataSet添加记录,主表和详细信息表之间的链接是主表中的自动增量字段。我找到了一个问题/答案对,似乎可以回答我的问题:Inserting records with autoincrementing primary keys

我不明白的是在查询中设置所需的标记。我无法弄清楚如何做到这一点,因为我太缺乏经验,也不明白为什么有必要。

与上面提到的问题类似,我有一个

(SQLConnection->TSQLDataSet->DataSetProvider->ClientDataSet using dbexpress.
              |            |->LinkDataSource
              ->TSQLDataSet2->LinkDataSource

我将数据加载到我的嵌套ClientDataSet中,因此组件链接创建嵌套结构工作。将主/明细表加载到嵌套数据集后,以下代码会出错。

MasterCDS1.Append;
MasterCDS1.FieldByName('TLNo').Required := False;
MasterSDS.FieldByName('TLNo').Required := False; { Error: Field 'TLNo' not found }
MasterCDS1.FieldByName('TLNo').ProviderFlags := [pfInWhere, pfInKey];
{ ... Populate Master table Fields}
MasterCDS1.Post;
MasterCDS1.ApplyUpdates(0);

TLNo是链接主表的主表和部分的字段,以及详细信息表的主键的部分。我尝试设置TSQLDataSet的第三行生成注释中显示的错误。 MasterSDS是我放置'Select * from master'查询的地方。 MasterCDS从此查询中学习Schema,并且字段TLNo是主表和详细MySQL表中的必填字段。第三行代码是我对Uwe Raabe先生所说的“解释”。显然我做错了。有人可以提供一个代码示例,以便这个Delphi noob不会误解指令吗?提前谢谢。

1 个答案:

答案 0 :(得分:2)

我能想象你描述的错误的唯一原因是当你执行第三行时 MasterSDS 没有打开。当字段不存在于表中或数据集(即本例中的查询)未打开且未定义静态字段时,“未找到字段”会引发。

这引出了我想提及的另一点:在相应数据集的 AfterOpen 事件中放置必需 ProviderFlags 设置。添加记录时无需重复这些设置。如果使用静态字段,您甚至可以在对象检查器中执行这些设置。

作为入门者,我建议您始终使用可在IDE内部调整的静态字段。这将大大简化事情。

相关问题