2010-02-04 84 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;