2010-02-04 5 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 должен иметь и независимые данные (по крайней мере, я так думал). Однако выполнение Delete на qryOryginal вызывает ту же операцию на qryClone. Я не хочу этого.

Любые идеи?

Я знаю, что я мог бы хранить данные в другом месте, в TClientDataSet, возможно, но сначала я хотел бы попробовать вышеуказанное решение.

Заранее благодарим за ваше время.

ответ

0

Клонирование просто клонирует курсор на наборе данных, а не дублирует данные, хранящиеся в наборе данных.

Если вам нужно иметь два независимых данных, вам необходимо скопировать данные из исходного набора данных во второй.

Если вы хотите прочитать или изменить один набор данных без изменения текущего курсора в наборе данных, вы можете использовать метод Clone.

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 до Delphi XE. 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; 

 Смежные вопросы

  • Нет связанных вопросов^_^