2011-06-11 82 views
15

当尝试刷新连接到SQL语句中具有连接表的数据集的ClientDataset上的记录时,TClientDataset.RefreshRecord不再生成SQL的表连接部分。ClientDataset.RefreshRecord不再适用于Delphi XE中的连接表 - 任何解决方法?

因此,调用此方法将导致对于不在主表中的每个字段,SQL错误“无效列名”

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

该错误发生于两个或DBX4 BDE部件连接到所述的TClientdataSet并且因此很可能的问题是与修改的TClientdataSet代码的问题。

复制此问题:

只有一个单一的形式创建德尔福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语句中,您会看到它没有包含表连接语句。

====

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

+4

参见QC#88935 - [TClientDataSet.RefreshRecord不再适用于JOINED查询](http://qc.embarcadero.com/wc/qcmain.aspx?d=88935) – 2011-06-11 12:31:20

回答

1

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

+0

这可能是一种解决方法但会涉及要求数据库的权限来创建视图。我希望可以对Delphi代码进行修复,避免必须诉诸意见。 – Gary 2011-07-05 04:51:51

相关问题