[英]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.