2014-03-06 25 views
4

默認情況下,TClientDataSet跟蹤DataSet中所做的所有更改(插入,更新,刪除)。有沒有辦法告訴數據集接受當前的更改(在使用insert/post進行一系列插入之後,比方說),而不實際調用數據庫來保存任何內容?用作內存數據集的TClientDataSet - 是否可以在不將數據保存到數據庫的情況下應用內存中的更新?

我想到的一個想法是使用TDataSetProvider並實現BeforeUpdateRecord事件並將Applied參數設置爲true。我不喜歡這件事的兩件事。我必須再添加兩個對象(TDataSetProvider和TSQLQuery對象),並且ApplyUpdates啓動一個事務。有一種更簡單的方法嗎?

如果我沒有在TClientDataSet上設置ProviderName,則ApplyUpdates失敗。

謝謝

+0

設置LogChanges假插入之前,或致電MergeChangeLog。或者我還沒有明白.. –

+0

@SertacAkyuz:就是這樣。請回答,以便我可以接受您的答案作爲解決方案。 – costa

+0

@Sertac:看起來你確實打敗了我。如果您發佈包含該信息的答案,我會刪除我的。 (我看到了這個問題和唯一的答案,但在發佈之前沒有閱讀這些評論。答案就是你的答案。) –

回答

5

在修改數據集之前,您可以將LogChanges設置爲false。另外,如果您在任何階段都需要更改日誌,則可以撥打MergeChangeLog來合併更新。

+0

+1。做得很好。 :-) –

0

我以這種方式使用它。我使用數據庫中的數據加載它,然後將數據發送到FastReports實例或PDF表單或Excel電子表格。它使我可以使用一個過程來生成我所有不同種類的輸出。自從我設置它以來已經有一段時間了,但我認爲我按照你描述的方式來設置它。

+0

我不認爲你的答案適用於我的問題... – costa

+0

對不起。我可能錯過了你的觀點。聽起來就像塞爾塔克無論如何都給你你需要的東西。希望他會回來,並作出迴應的答案。 – jrodenhi

1

請注意,有一個錯誤(至少在D2006中)可能會導致您非常頭痛:如果LogChanges爲False,某些篩選器功能無法正常工作:即使記錄可能仍保留在已過濾的數據集中它們的值不符合給定的過濾標準。

看到這個單元測試:

procedure TestCDS.TestLogChanges; 
    var CDS: TClientDataset; 
    begin 
    CDS := TClientDataset.Create(NIL); 
    try 
     CDS.FieldDefs.Add('MyStringField', ftString, 20); 
     CDS.CreateDataSet; 
     try 
      CDS.LogChanges := False; 
      CDS.Filter := 'MyStringField is null'; 
      CDS.Filtered := True; 
      Check(CDS.RecordCount= 0); 
      CDS.Insert; 
      CDS.Post; 
      Check(CDS.RecordCount= 1); 
      CDS.Edit; 
      CDS.FieldByName('MyStringField').AsString := 'Text'; 
      CDS.Post; 
      Check(CDS.RecordCount= 0, 'Recordcount is not 0 after changing value!'); 
     finally 
      CDS.Close; 
     end; 
    finally 
     CDS.Free; 
    end; 
    end; 

也可以看看這裏,它顯然是一個老的bug:http://www.delphigroups.info/2/f0/463155.html

相關問題