首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于TClientDataSet的数据

关于TClientDataSet的数据
EN

Stack Overflow用户
提问于 2014-03-14 12:26:48
回答 2查看 856关注 0票数 0

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

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

代码语言:javascript
复制
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的”内存?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-14 12:46:45

数据属性后面的数据存储被引用计数。因此,您不必费心地释放它。

如果您想深入研究TClientDataSet的本质,我建议您阅读凯里·詹森( Cary Jensen:深度德尔菲: ClientDataSets )那本非常优秀的书。

票数 2
EN

Stack Overflow用户

发布于 2014-03-17 11:04:31

通过像您所做的那样分配Data属性来复制记录。现在您有两个不同的TClientDataset同义词,它们有两个不同的记录集,它们的结构完全相同,行数相同,字段值相同。

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22404948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档