【问题标题】:TClientDataSet used as in-memory dataset - is it possible to apply the updates in-memory without saving the data to a database?TClientDataSet 用作内存数据集 - 是否可以在内存中应用更新而不将数据保存到数据库?
【发布时间】:2014-03-06 02:11:35
【问题描述】:

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

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

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

谢谢

【问题讨论】:

  • 在插入之前将 LogChanges 设置为 false,或者调用 MergeChangeLog。或者我没看懂..
  • @SertacAkyuz:就是这样。请回答,以便我接受您的回答作为解决方案。
  • @Sertac:看起来你真的打败了我。如果您发布包含该信息的答案,我将删除我的。 (我看到了这个问题和唯一的答案,但在发布之前没有读过 cmets。答案是你的。)
  • @Ken - 完成。谢谢你,实际上你不必在回答之前看cmet。

标签: delphi dbexpress tclientdataset


【解决方案1】:

您可以在修改数据集之前将LogChanges 设置为false。或者,如果您在任何阶段都需要更改日志,可以致电MergeChangeLog 以合并更新。

【讨论】:

    【解决方案2】:

    请注意,有一个错误(至少仍然存在于 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

    【讨论】:

      【解决方案3】:

      我就是这样用的。我从数据库中加载数据,然后将数据发送到 FastReports 实例或 PDF 表单或 Excel 电子表格。它使我可以使用一个过程来产生我所有不同类型的输出。我设置它已经有一段时间了,但我想我是按照你描述的方式设置的。

      【讨论】:

      • 对不起。我可能错过了你的观点。听起来 Sertac 无论如何都给了你你需要的东西。希望他能回来并做出回应。
      猜你喜欢
      • 2016-11-11
      • 2017-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-15
      • 1970-01-01
      相关资源
      最近更新 更多