當嘗試刷新連接到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