2011-08-24 25 views
2

Embarcadero®Delphi®2010版14.0.3593.25826德爾福的TClientdataSet「試圖修改只讀域」在SQL Server 2008中的錯誤,確定在2000

我們正試圖從SQL Server 2000數據庫移動到SQL Server 2008.我有裝載有選擇包括計算列,即一個TClientDataSet「SELECT Comp_Col =列1 +‘’+列2 ...」。

運行鍼對SQL Server 2000數據庫,我可以使用下面的代碼修改在TClientDataSet列的值:

ClientDataSet1.Edit(); 
ClientDataSet1.FieldByName('Comp_Col').ReadOnly := false; 
ClientDataSet1.FieldByName('Comp_Col').Value := 'MODIFIED'; 
ClientDataSet1.FieldByName('Comp_Col'').ReadOnly := true; 
ClientDataSet1.Post(); // <-- EXCEPTION in 2008 

運行鍼對SQL Server 2008數據庫,不過,我得到一個「試圖在執行.Post()時修改只讀字段「錯誤。

我試圖也設置.ProviderFlags =「[]」的列(除了.ReadOnly =假)在上述代碼中,但仍然得到錯誤。我也試圖通過IDE設置.ReadOnly =虛假和.ProviderFlags =「[]」在設計時,但這並沒有幫助。

任何人都知道如何在一個TClientDataSet設置計算列針對SQL Server 2008數據庫上運行時?

謝謝!

* UPDATE:的回答*

我發現了這個問題 - 或至少是一個解決辦法...

WAS設置.ReadOnly =假在的TClientdataSet對象。這個工作與SQL Server 2000,但不與SQL Server 2008中

如果我設置在列.ReadOnly =假代替在被作爲供應商的TADOQuery對象,然後我我能夠設置計算列的值在運行時將TClientDataSet對象。

對我來說並不理想,因爲這是在TClientDataSet對象的一個​​通用函數中實現的(對提供者沒有任何提示),但現在必須完成。

+2

我很驚訝,這是允許的。在舊系統中,發佈時實際上做了什麼?它是否將「MOD」放入Column1中並將「IFIED」放入Column2中?我並不感到驚訝,數據庫拋出了一個WTF。 –

+0

@ user356740:我相信FieldDefs中該字段的定義仍然在屬性屬性 – AlexSC

+0

Tnx中使用faReadOnly來解決此問題。有一點需要補充:在打開'ClientDataSet'之前,應將'ADOQuery.Field.Readonly'設置爲'False'。 – saastn

回答

0

我發現了這個問題 - 或者至少是一個解決方法。 。 。

WAS設置.ReadOnly =假在的TClientdataSet對象的列。這個工作與SQL Server 2000,但不與SQL Server 2008中

如果我設置.ReadOnly = false爲列代替在被作爲供應商的TADOQuery對象,然後我能夠在運行時在TClientDataSet對象中設置計算列的值。

對我來說並不理想,因爲這是在TClientDataSet對象的一個​​通用函數中實現的(對提供者沒有任何提示),但現在必須完成。

0

我的經驗表明,通過最初調用TClientDataSet.CreaeteDataSet而不使用ReadOnly標誌來創建ClientDataSet字段可以解決問題。打開ClientDataSet字段後,可以將ReadOnly標誌返回其席位,以便數據感知控件正常運行。