默认情况下,TClientDataSet会跟踪DataSet中所做的所有更改(插入,更新,删除)。有没有办法告诉数据集接受当前的更改(在使用insert / post进行一系列插入之后,比方说),而不实际调用数据库来保存任何内容?
我想到的一个想法是使用TDataSetProvider并实现BeforeUpdateRecord事件并将Applied参数设置为true。我不喜欢这件事。我必须再添加两个对象(TDataSetProvider和TSQLQuery对象),ApplyUpdates启动一个事务。有更简单的方法吗?
如果我没有在TClientDataSet上设置ProviderName,则ApplyUpdates失败。
由于
答案 0 :(得分:5)
在修改数据集之前,您可以将LogChanges
设置为false。或者,如果您在任何阶段需要更改日志,则可以致电MergeChangeLog
以合并更新。
答案 1 :(得分: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;
另外看看这里,它显然是一个较老的错误:http://www.delphigroups.info/2/f0/463155.html
答案 2 :(得分:0)
我用那种方式。我使用数据库中的数据加载它,然后将数据发送到FastReports实例或PDF表单或Excel电子表格。它使我可以使用一个过程来生成我所有不同类型的输出。我设置它已经有一段时间,但我认为我按照你描述的方式进行设置。