QDataSet – 克隆和复制数据详解

QDataSet 提供了克隆( Clone ) 和 复制 (CopyFrom)  两个方法来从另一个数据集中创建一个数据集内容的拷贝。但 Clone 和 CopyFrom 方法的主要区别在于:

  • Clone 是创建了一个对源数据集的引用,克隆实际上相当于创建了一组新的游标,来指向原来的数据集,您可以对这个克隆后的数据集进行过滤、排序等各种处理,但你如果对其中任意一个数据集的数据进行了修改,则变动会同步反馈到另一个数据集。简言之,克隆出来的数据集内容和克隆源完全同步,不同的是克隆出来的数据集可以进行独立的过滤、排序等处理,而不会对克隆源产生影响。
  • CopyFrom 是创建了一个源数据集内容的拷贝实例,对拷贝实例的增删改都不会地源数据集产生任何影响。拷贝后的实例你可以根据需要进行增删查改,而这些变动不会反馈到源数据集。CopyFrom 函数支持多种复制方式,更灵活。

我们来看下克隆和复制相关的函数声明:

    /// <summary> 从源数据集克隆一个新实例 </summary>
    /// <param name="ASource">克隆的源数据集</param>
    procedure Clone(ASource: TQDataSet);
    /// <summary> 断开与克隆源数据集的链接</summay>
    /// <remarks>断开连接后,数据集的变更不会再反馈到克隆源及其它克隆数据集</remarks>
    procedure Unlink;
    /// <summary> 从源数据集拷贝一个新实例</summary>
    /// <param name="ASource"> 源数据集 </param>
    /// <param name="AMethod"> 复制方式</param>
    procedure CopyFrom(ASource: TQDataSet; AMethod: TQDataCopySource); overload;
    /// <summary> 从源数据集拷贝一个新实例</summary>
    /// <param name="ASource"> 源数据集 </param>
    procedure CopyFrom(ASource: TDataSet); overload;

1、Clone

此函数唯一的是参数是源数据集对象。

2、Unlink

对于一个克隆来的数据集,此函数用于强制断开与源数据集的链接。 Unlink 会将源数据集进行一个内容的拷贝,以便保证在断开链接后依然能够正常工作。断开后的数据集不会再与克隆源之间同步状态变更。

3、CopyFrom

CopyFrom 有两个重载,一个是从普通的数据集来复制内容,另一个是从一个TQDataSet 类弄的源数据集中复制内容。我们主要说明后一个方法中的AMethod参数:

  • dcmUnknown : 在复制时等价于 dcmView
  • dcmView : 如果是分页模式下,则仅复制当前分页内的数据,否则,复制当前显示范围内的数据
  • dcmCurrents : 复制数据集内所有内容的当前状态
  • dcmOrigins : 复制数据集内所有内容的原始数据(未修改或删除前的记录),注意删除的数据会位于复制后的数据集尾部(因为原始的位置信息在删除时会丢失,所以暂时不支持恢复)
  • dcmInserted : 只复制变更内容中新插入的数据
  • dcmDeleted : 只复制变更内容中已删除的数据
  • dcmModified : 只复制变更内容中已修改的数据
  • dcmChanged : 复制所有的变更内容
  • dcmSorted : 按当前排序的结果复制已排序的数据
  • dcmFiltered : 按当前过滤的结果复制已过滤的数据
  • dcmMetaOnly :只复制数据集定义,不复制数据内容

从普通的数据集参数复制内容时,其操作等价于 dcmView,只复制源数据集中当前显示范围内的内容。下图是 Demos\Delphi\VCL\QDB\Copy 演示程序的实际运行效果,其中前50条记录被标记为 usUnmodified,51 开始的50条记录被标记为 usModified,101 和 102 两条记录被删除以便被标记为 usDeleted。

DSCopy

分享到: