Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql ClientDataset.RefreshRecord在Delphi XE中不再适用于联接表-有解决方法吗?_Sql_Delphi_Delphi Xe_Tclientdataset - Fatal编程技术网

Sql ClientDataset.RefreshRecord在Delphi XE中不再适用于联接表-有解决方法吗?

Sql ClientDataset.RefreshRecord在Delphi XE中不再适用于联接表-有解决方法吗?,sql,delphi,delphi-xe,tclientdataset,Sql,Delphi,Delphi Xe,Tclientdataset,TClientDataset.RefreshRecord在尝试刷新ClientDataset上的记录时不再生成SQL的表联接部分,该ClientDataset连接到SQL语句中具有联接表的数据集。 因此,调用此方法会导致主表以外的每个字段出现SQL错误“无效列名” 这在Delphi 2010及更早版本中不是问题。 DBX4或BDE组件连接到TClientDataset时都会发生错误,因此问题很可能是TClientDataset代码更改的问题。 要复制此问题: 在Delphi XE中创建一个新的应

TClientDataset.RefreshRecord在尝试刷新ClientDataset上的记录时不再生成SQL的表联接部分,该ClientDataset连接到SQL语句中具有联接表的数据集。

因此,调用此方法会导致主表以外的每个字段出现SQL错误“无效列名”

这在Delphi 2010及更早版本中不是问题。

DBX4或BDE组件连接到TClientDataset时都会发生错误,因此问题很可能是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生成的RefreshRecordSQL语句中,您将看到它没有包含table join语句

====


我非常感谢您能提供有关如何解决此问题的任何想法。

尝试在数据库上使用
视图来实现所需的连接。然后,delphi组件可以从视图名称中选择,而不必处理连接本身。

另请参见QC#88935-这可能是一种解决方法,但需要数据库的权限才能创建视图。我希望可以对Delphi代码进行热修复,从而避免求助于视图。