当尝试刷新连接到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语句中,您会看到它没有包含表连接语句。
====
我真的很感激任何想法如何解决这个问题。
参见QC#88935 - [TClientDataSet.RefreshRecord不再适用于JOINED查询](http://qc.embarcadero.com/wc/qcmain.aspx?d=88935) – 2011-06-11 12:31:20