0

我制作了一个将数据从 A 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”的内存?
4

2 回答 2

2

驻留在 Data 属性后面的数据存储是引用计数的。因此,您不必费心发布它。

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

于 2014-03-14T12:46:45.257 回答
1

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

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

为了释放数据,只需关闭数据集。

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

于 2014-03-17T11:04:31.093 回答