2010-02-04 121 views
3

情景是这样的:如何实现独立克隆的TADODataSet?

我们有一些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中的其他地方存储数据,但我想先尝试上面的解决方案。

提前感谢您的时间。

回答

0

克隆只是将光标克隆到数据集上,而不是复制保存在数据集中的数据。

如果您需要两个独立的数据,那么您必须将数据从原始数据集复制到第二个数据集。

如果您想在不更改数据集上当前光标的情况下读取或修改单个数据集,则可以使用克隆方法。

7

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

ds1.Recordset := CloneRecordset(ds2.Recordset); 

该版本从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; 

此版本必须用于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;