用作内存数据集的TClientDataSet - 是否可以在不将数据保存到数据库的情况下在内存中应用更新?

时间:2014-03-06 02:11:35

标签: delphi dbexpress tclientdataset

默认情况下,TClientDataSet会跟踪DataSet中所做的所有更改(插入,更新,删除)。有没有办法告诉数据集接受当前的更改(在使用insert / post进行一系列插入之后,比方说),而不实际调用数据库来保存任何内容?

我想到的一个想法是使用TDataSetProvider并实现BeforeUpdateRecord事件并将Applied参数设置为true。我不喜欢这件事。我必须再添加两个对象(TDataSetProvider和TSQLQuery对象),ApplyUpdates启动一个事务。有更简单的方法吗?

如果我没有在TClientDataSet上设置ProviderName,则ApplyUpdates失败。

由于

3 个答案:

答案 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电子表格。它使我可以使用一个过程来生成我所有不同类型的输出。我设置它已经有一段时间,但我认为我按照你描述的方式进行设置。