1

我正在使用 MySQL 数据库自学 Delphi 数据库编程。我正在尝试从嵌套的 ClientDataSet 添加一条记录,其中包含主表和详细表之间的链接以及主表中的自动增量字段。我在以下位置找到了一个似乎可以回答我的问题的问题/答案对:使用自动递增主键插入记录

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

与上面链接的问题类似,我有一个

(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 不会误解说明吗?提前致谢。

4

1 回答 1

2

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

这就引出了我要提的另一点:将RequiredProviderFlags设置放在相应数据集的AfterOpen事件中。每次追加记录时都无需重复这些设置。如果您使用静态字段,您甚至可以在对象检查器中进行这些设置。

作为初学者,我建议您始终使用可以在 IDE 中调整的静态字段。这将大大简化事情。

于 2013-05-18T09:31:23.377 回答