簡體   English   中英

用作內存數據集的TClientDataSet - 是否可以在不將數據保存到數據庫的情況下在內存中應用更新?

[英]TClientDataSet used as in-memory dataset - is it possible to apply the updates in-memory without saving the data to a database?

默認情況下,TClientDataSet會跟蹤DataSet中所做的所有更改(插入,更新,刪除)。 有沒有辦法告訴數據集接受當前的更改(在使用插入/發布的一系列插入之后,讓我們說)而不實際調用數據庫來保存任何東西?

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

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

謝謝

在修改數據集之前,可以將LogChanges設置為false。 或者,如果您在任何階段需要更改日志,則可以調用MergeChangeLog來合並更新。

請注意,有一個錯誤(至少仍然在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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM