如何实现独立克隆的TADODataSet?

Wod*_*dzu 4 delphi cloning tadodataset tadoquery

场景是这样的:

我们有一些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;
Run Code Online (Sandbox Code Playgroud)

因此,在克隆DataSet之后,我的qryClone应该保存并且独立数据(至少我是这么认为的).但是,在qryOryginal上执行Delete会导致qryClone上的操作相同.我不希望这样.

有任何想法吗?

我知道我可以将数据存储在TClientDataSet中的其他位置,但我想首先尝试上述解决方案.

在此先感谢您的时间.

Mik*_*son 8

您可以使用TADODataSet的记录集来克隆TADODataSet.

ds1.Recordset := CloneRecordset(ds2.Recordset);
Run Code Online (Sandbox Code Playgroud)

此版本适用于Delphi XE.ADOInt使用MDAC 2.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;
Run Code Online (Sandbox Code Playgroud)

在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;
Run Code Online (Sandbox Code Playgroud)