4

シナリオは次のようになります。

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 にデータを保存できることはわかっていますが、最初に上記のソリューションを試してみたいと思います。

お時間をいただきありがとうございます。

4

4 に答える 4

8

TADODataSetのレコードセットを使用して、TADODataSetのクローンを作成できます。

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

このバージョンはDelphiXEから動作します。ADOIntは、MDAC2.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;

このバージョンは、DelphiXEより前のバージョンの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;
于 2011-01-25T08:56:41.620 に答える
0

クローンは、データセットに保持されているデータを複製するのではなく、データセットにカーソルを複製するだけです。

2つの独立したデータが必要な場合は、元のデータセットから2番目のデータセットにデータをコピーする必要があります。

データセットの現在のカーソルを変更せずに単一のデータセットを読み取ったり変更したりする場合は、Cloneメソッドを使用できます。

于 2010-02-04T15:05:41.977 に答える