2011-06-11 83 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

相關問題