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。