Delphi 关于TClientDataSet中的数据

Delphi 关于TClientDataSet中的数据,delphi,dataset,memory-safety,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

我创建了一个函数,将数据从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”内存

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


如果您想深入了解TClientDataSet的本质,我建议您阅读Cary Jensen的一本非常优秀的书:

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


如果您想深入了解TClientDataSet的本质,我建议您阅读Cary Jensen的一本非常优秀的书:

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


如果您想深入了解TClientDataSet的本质,我建议您阅读Cary Jensen的一本非常优秀的书:

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


如果您想深入了解TClientDataSet的本质,我建议您阅读Cary Jensen的一本非常优秀的书:

,方法是像复制记录一样指定
数据
属性。现在,您有了两个不同的ISNTance of
TClientDataset
,两组不同的记录具有完全相同的结构、相同的行数和相同的字段值

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

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


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

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

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

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


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

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

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

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


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

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

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

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


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

+1。感谢您解决
这样做安全吗?(所谓安全,我的意思是,我应该期待什么样的异常以及如何处理它们?
。我接受了@uwerabe的回答,因为他首先回答,并解释说数据是参考计数的。这很重要,因为有