关于来自TClientDataSet的数据

时间:2014-03-14 12:26:49

标签: delphi dataset memory-safety

我创建了一个将数据从TClientDataSet复制到B的函数。

在生产中,代码将动态填充TClientDataSet,如下所示:

procedure LoadClientDataSet(const StringSql: String; ParamsAsArray: array of Variant; CdsToLoad: TClientDataSet);
begin
  //There is a shared TClientDataSet that retrieves 
  //all data from a TRemoteDataModule in here.

  //the following variables (and code) are here only to demonstration of the algorithm;
  GlobalMainThreadVariable.SharedClientDataSet.CommandText := StringSql;
  //Handle Parameters
  GlobalMainThreadVariable.SharedClientDataSet.Open;


  CdsToLoad.Data:= GlobalMainThreadVariable.SharedClientDataSet.Data;

  GlobalMainThreadVariable.SharedClientDataSet.Close; 
end;    

那说:

  • 这样做是否安全? (安全我的意思是,我应该期待什么样的例外以及如何处理它们?)
  • 我如何发布" .Data""存储器?

2 个答案:

答案 0 :(得分:2)

数据属性后面的数据存储是引用计数。因此,您无需费心去除它。

如果你想深入了解TClientDataSet的内在函数,我建议你阅读Cary Jensen的优秀书籍:Delphi in Depth: ClientDataSets

答案 1 :(得分:1)

通过像您一样分配Data属性,重复记录。您现在有两个不同的TClientDataset的等值,它们具有两组不同的记录,具有完全相同的结构,相同的行数和相同的字段值。

如果接收TClientDataset没有先前定义的任何字段结构或现有结构与所分配的Data兼容,那么这样做是安全的。但是,如果我们谈论大量记录,分配可能需要很长时间,并且在极端情况下,它可能会耗尽计算机的内存(这完全取决于计算机的配置)。

要发布数据,只需关闭数据集。

如果您希望有两个TClientDataset实例但只有一个记录实例,我的建议是使用TClientDataset.CloneCursor方法,而不是复制数据,只需为其分配一个引用在不同的数据集中。在这种情况下,它是两个不同数据集之间共享的相同数据。