我创建了一个将数据从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;
那说:
答案 0 :(得分:2)
数据属性后面的数据存储是引用计数。因此,您无需费心去除它。
如果你想深入了解TClientDataSet的内在函数,我建议你阅读Cary Jensen的优秀书籍:Delphi in Depth: ClientDataSets
答案 1 :(得分:1)
通过像您一样分配Data
属性,重复记录。您现在有两个不同的TClientDataset
的等值,它们具有两组不同的记录,具有完全相同的结构,相同的行数和相同的字段值。
如果接收TClientDataset
没有先前定义的任何字段结构或现有结构与所分配的Data
兼容,那么这样做是安全的。但是,如果我们谈论大量记录,分配可能需要很长时间,并且在极端情况下,它可能会耗尽计算机的内存(这完全取决于计算机的配置)。
要发布数据,只需关闭数据集。
如果您希望有两个TClientDataset
实例但只有一个记录实例,我的建议是使用TClientDataset.CloneCursor
方法,而不是复制数据,只需为其分配一个引用在不同的数据集中。在这种情况下,它是两个不同数据集之间共享的相同数据。