sql – ClientDataset.RefreshRecord不再适用于Delphi XE的连接表 – 任何解决方法?

当尝试刷新连接到sql语句中具有连接表的数据集的ClientDataset上的记录时,TClientDataset.RefreshRecord不再生成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的关键字字段的提供者标志(如果不知道哪个字段是关键字,则RefreshRecord将不起作用,因此持久字段是必须的).

在表单上添加两个按钮 – 一个只打开Clientdataset,第二个按钮调用clientdataset.refreshrecord;

运行应用程序,按按钮打开网格中的数据集和数据显示.

按刷新记录按钮,您将收到连接字段的sql错误“无效列名称”.

关闭应用程序,打开sqlMonitor日志,并在Delphi生成的刷新记录sql语句中,您将看到它没有包含表连接语句.

====

我真的很感激任何关于如何解决这个问题的想法.

解决方法

尝试使用数据库上的视图来实现所需的连接.那么delphi组件只能从view_name中选择,而不必处理连接本身.

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...