質問

のシナリオは、このようなものです。

私たちは、いくつかの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の中に、別の場所にデータを格納することができ知っているが、私は最初に上記の溶液を試してみたいと思います。

あなたの時間を事前に感謝します。

役に立ちましたか?

解決

ちょうどクローニングは、データセットに保存データを複製していない、データセットにカーソルを複製します。

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

あなたがデータセットで現在のカーソルを変更することなく、1つのデータセットを読み取りまたは変更したい場合は、あなたがCloneメソッドを使用することができます。

他のヒント

あなたはの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にデルファイのバージョンのために使用されなければなりません。 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;

私よりTClientDataSetのと実現のように、我々はコピーした後、必要があるとして、私たちは自由に編集することができますので。

var
  MyADOStoredProc: TADOStoredProc;
  DataSetProvider: TDataSetProvider;
  ClientDataSet: TClientDataSet;
  DataSource: TDataSource;


    ...

    // here now we have an opened ADOStoredProc object MyADOStoredProc
    // let's copy data from it

    DataSetProvider := TDataSetProvider.Create(Self);
    DataSetProvider.Name := 'DataSetProvider' + FormatDateTime('_yyyy_mm_dd_hh_nn_ss', Now);
    DataSetProvider.DataSet := MyADOStoredProc;
    ClientDataSet := TClientDataSet.Create(Self);
    ClientDataSet.ProviderName := DataSetProvider.Name;
    DataSource := TDataSource.Create(Self);
    DataSource.DataSet := ClientDataSet;

    ClientDataSet.Open;
    MyADOStoredProc.Close;

    ClientDataSet.First;
    // here we can modify our ClientDataSet as we need, besides MyADOStoredProc is closed
    if not ClientDataSet.Eof then
      ClientDataSet.Delete;

    ...
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top