首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实现自主克隆的TADODataSet?

如何实现自主克隆的TADODataSet?
EN

Stack Overflow用户
提问于 2010-02-04 17:52:08
回答 4查看 4.7K关注 0票数 4

场景如下:

我们有一些SQL表。我们在这个表上执行SQL查询,并在TADOQuery对象中得到结果。

代码语言:javascript
复制
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,但我想先尝试上面的解决方案。

提前感谢您的宝贵时间。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-02-04 23:05:42

克隆只克隆数据集上的光标,而不复制保留在数据集中的数据。

如果您需要两个独立的数据,则必须将数据从原始数据集复制到第二个数据集。

如果要读取或修改单个数据集,而不更改该数据集上的当前光标,则可以使用Clone方法。

票数 0
EN

Stack Overflow用户

发布于 2011-01-25 16:56:42

您可以使用TADODataSet的记录集克隆TADODataSet。

代码语言:javascript
复制
ds1.Recordset := CloneRecordset(ds2.Recordset);

此版本可从Delphi XE运行。ADOInt使用MDAC2.8的类型库定义进行了更新

代码语言:javascript
复制
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生成的。

代码语言:javascript
复制
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;
票数 8
EN

Stack Overflow用户

发布于 2018-04-18 01:43:52

我更喜欢用TClientDataSet实现,因为我们可以在复制后根据需要自由编辑它。

代码语言:javascript
复制
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;

    ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2198675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档