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

그래서, 데이터 집합을 복제 한 후 내 qryClone은 보유해야하고 독립적 인 데이터는 (적어도 나는 그렇게 생각했다). 그러나 qryOrginal에 대해 Delete를 수행하면 qryClone에서 동일한 작업이 발생합니다. 나는 그것을 원하지 않는다.

아이디어가 있으십니까?

아마도 TClientDataSet에 데이터를 저장할 수 있지만 위의 솔루션을 먼저 시도하고 싶습니다.

미리 감사드립니다.

답변

0

클로닝은 커서를 데이터 세트에 복제하고 데이터 세트에 보관 된 데이터는 복제하지 않습니다.

두 개의 독립적 인 데이터가 필요할 경우 원래 데이터 세트의 데이터를 두 번째 데이터 세트로 복사해야합니다.

데이터 집합의 현재 커서를 변경하지 않고 단일 데이터 집합을 읽거나 수정하려면 복제 방법을 사용할 수 있습니다.

7

TADODataSet의 레코드 세트를 사용하여 TADODataSet을 복제 할 수 있습니다.

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

이 버전은 Delphi XE에서 작동합니다. ADOInt이 버전은 이전에 델파이 XE에 델파이의 버전을 사용해야합니다 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; 

에 대한 형식 라이브러리 정의로 업데이트됩니다. 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;