2012-11-14 22 views
2

我有下列控制的一種形式:TDBEditTDBMemoTDataSourceTClientDataSetTClientDataSet.Cancel失去TDBMemo值

如果用戶編輯字段,然後點擊表格上的一個按鈕,簡單地調用MyCDS.Cancel方法(若要取消編輯),則TDBEdit字段將還原爲其原始值,但TDBMemo字段不會還原(它們被設置爲空白值)。

TClientDataSet從MSSQLServer 2008數據庫填充。數據庫中的TDBEdit字段爲nvarchar(255)TDBMemonvarchar(max)xml字段。

綜觀在調試檢查器中的值(CTRL + F7,MyCDS.FieldByName( '更遠'),檢查)顯示了nvarchar(max)字段的下列之一:

  • 數據尺寸= 0
  • 數據類型= ftWideMemo
  • 尺寸= 1

這是所有的nvarchar(max)xml字段的相同與否底層網絡連接現場有數據或沒有數據。

似乎在nvarchar(max)(它被視爲ftWideMemo)和TDBMemo控件之間存在不兼容性。

有沒有人見過這樣的問題?你有什麼建議如何解決它?

+2

「TDBMemo」連接的字段類型是什麼?另外,有兩個想法:1)爲什麼不簡單使用'SysUtils.Abort;',因爲異常應該是無聲的? 2)編輯開始之前禁用導航功能不是更容易,直到他們已經保存或取消編輯? –

+0

@Ken - 我修改了這個問題。它現在反映了我最近的疑難解答 –

+0

很好修改。 (+1,順便說一句 - 以前應該做到這一點)。我沒有在這臺機器上安裝SQL Server 2008,所以我將無法在明天之前嘗試重現此問題。恐怕我現在沒有任何建議。有幾個人在這裏經常遇到Delphi關於'TClientDataSet'的相關知識,所以你可能會很快得到答案。如果沒有的話,如果可以的話,我會在明天看到它的第一件事。 –

回答

0

如果有人感興趣,這個問題是TClientDataSet組件中的一個錯誤。該問題僅發生在克隆數據集時,沒有Provider並關閉LogChanges。如果您在克隆的數據集上編輯記錄,然後取消編輯,則任何字段都會丟失其值。

由於您不一定在基於文件的應用程序中使用Provider,因此啓用LogChanges並不總是有意義的。但是,要解決備註字段的限制,您可以打開LogChanges,然後在更改克隆數據集的操作之後調用MergeChangeLog

我創建了一個程序來演示這個問題。參見Embarcadero事件QC#110511。