场景如下:
我们有一些SQL表。我们在这个表上执行SQL查询,并在TADOQuery对象中得到结果。
var
qryOryginal, qryClone: TADOQuery;
begin
//setup all the things here
qryOryginal.Active := True;
qryClone.Clone(qryOryginal, ltBatchOptimistic);
qryOryginal.Delete; //delete in qryOryginal casues that qryClone deletes its record too!
end;因此,在克隆DataSet之后,我的qryClone应该保存独立的数据(至少我是这么认为的)。但是,对qryOryginal执行删除操作会导致对qryClone执行相同的操作。我不想这样。
有什么想法吗?
我知道我可以将数据存储在其他地方,也许是TClientDataSet,但我想先尝试上面的解决方案。
提前感谢您的宝贵时间。
发布于 2010-02-04 23:05:42
克隆只克隆数据集上的光标,而不复制保留在数据集中的数据。
如果您需要两个独立的数据,则必须将数据从原始数据集复制到第二个数据集。
如果要读取或修改单个数据集,而不更改该数据集上的当前光标,则可以使用Clone方法。
发布于 2011-01-25 16:56:42
您可以使用TADODataSet的记录集克隆TADODataSet。
ds1.Recordset := CloneRecordset(ds2.Recordset);此版本可从Delphi XE运行。ADOInt使用MDAC2.8的类型库定义进行了更新
uses ADOInt, Variants;
function CloneRecordset(const Data: _Recordset): _Recordset;
implementation
function CloneRecordset(const Data: _Recordset): _Recordset;
var
newRec: _Recordset;
stm: Stream;
begin
newRec := CoRecordset.Create as _Recordset;
stm := CoStream.Create;
Data.Save(stm, adPersistADTG);
newRec.Open(stm, EmptyParam, CursorTypeEnum(adOpenUnspecified),
LockTypeEnum(adLockUnspecified), 0);
Result := newRec;
end;此版本必须用于Delphi XE之前的Delphi版本。ADOR_TLB是从msado28.tlb生成的。
uses ADOInt, ADOR_TLB, Variants;
function CloneRecordset(const Data: ADOInt._Recordset): ADOInt._Recordset;
implementation
function CloneRecordset(const Data: ADOInt._Recordset): ADOInt._Recordset;
var
newRec: ADOR_TLB._Recordset;
stm: Stream;
begin
newRec := ADOR_TLB.CoRecordset.Create as ADOR_TLB._Recordset;
stm := CoStream.Create;
(Data as ADOR_TLB._Recordset).Save(stm, adPersistADTG);
newRec.Open(stm, EmptyParam, CursorTypeEnum(adOpenUnspecified),
LockTypeEnum(adLockUnspecified), 0);
Result := newRec as ADOInt._Recordset;
end;发布于 2018-04-18 01:43:52
我更喜欢用TClientDataSet实现,因为我们可以在复制后根据需要自由编辑它。
var
MyADOStoredProc: TADOStoredProc;
DataSetProvider: TDataSetProvider;
ClientDataSet: TClientDataSet;
DataSource: TDataSource;
...
// here now we have an opened ADOStoredProc object MyADOStoredProc
// let's copy data from it
DataSetProvider := TDataSetProvider.Create(Self);
DataSetProvider.Name := 'DataSetProvider' + FormatDateTime('_yyyy_mm_dd_hh_nn_ss', Now);
DataSetProvider.DataSet := MyADOStoredProc;
ClientDataSet := TClientDataSet.Create(Self);
ClientDataSet.ProviderName := DataSetProvider.Name;
DataSource := TDataSource.Create(Self);
DataSource.DataSet := ClientDataSet;
ClientDataSet.Open;
MyADOStoredProc.Close;
ClientDataSet.First;
// here we can modify our ClientDataSet as we need, besides MyADOStoredProc is closed
if not ClientDataSet.Eof then
ClientDataSet.Delete;
...https://stackoverflow.com/questions/2198675
复制相似问题