TClientDataset.RefreshRecord 在尝试刷新连接到在 SQL 语句中具有连接表的数据集的 ClientDataset 上的记录时,不再生成 SQL 的表连接部分。
因此,调用此方法会导致每个不在主表中的字段的SQL 错误“列名无效” 。
这在 Delphi 2010 及更早版本中不是问题。
连接到 TClientDataset 的 DBX4 或 BDE 组件都会发生错误,因此问题很可能是 TClientDataset 代码更改的问题。
要复制此问题:
在 Delphi XE 中创建一个只有一个表单的新应用程序,并将所需的数据库组件(TSQLMonitor、TSQLConnection、TSQLQuery、TDatasetProvider、TClientDataset、TDatasource 和 TDBGrid)放在上面并将它们相互绑定。
创建了一个带有表连接的简单 SQL 语句,并将其放在 TSQLDataset.SQL 属性中。
SQL 语句仅包含两个字段 - 主表的键字段和连接表中的字段 - 例如在伪代码中:
Select
MainTable.IntegerKeyField
, JoinedTable.JoinField
FROM MainTable
LEFT OUTER JOIN JoinedTable ON MainTable.LookupFieldID = JoinedTable.JoinKeyField
将这两个字段作为持久字段添加到 TSQLQuery 和 TClientDataset 中,并为包括 pfInKey 在内的关键字段提供 Provider 标志(如果不知道哪个字段是关键字段,RefreshRecord 将不起作用,因此必须使用持久字段)。
在表单上添加两个按钮 - 一个只是打开 Clientdataset,第二个按钮调用 clientdataset.refreshrecord;
运行应用程序,按下按钮以打开数据集并在网格中显示数据。
按刷新记录按钮,您将收到连接字段的 SQL 错误“列名无效”。
关闭应用,打开 SQLMonitor 日志,在 Delphi 生成的刷新记录 SQL 语句中,你会看到它没有包含 table join 语句。
====
我非常感谢有关如何解决此问题的任何想法。