复制一个ClientQuery数据集到另外一个ClientQuery,我们应该怎么做?并注意什么呢?

kbmMW为我们提供了好几个方法,有LoadFromDataSet,CopyRawRecords,CopyRecords等。查看源码,应该是CopyRawRecords最有效率,但使用过程中遇到好几个莫名的问题,也是按照原码,最后用下面的写法,正确实现利用CopyRawRecords在ClientQuery间复制记录。下面是从项目中提取的代码,测试通过。

ClientQuery.DisableControls;
ClientQuery.DisableEvents;
origEnableVersioning := ClientQuery.EnableVersioning;
OrigAutoPopulate := ClientQuery.AutoPopulateOnOpen;
OrigAutoFieldDefs := ClientQuery.AutoFieldDefsOnOpen;
ClientQuery.AutoPopulateOnOpen := false;
ClientQuery.AutoFieldDefsOnOpen := mwafoNever;
ClientQuery.EnableVersioning:=False;
try
FInternalClientQuery.LoadFromStreamViaFormat(c.ResultStream, bsf);
if not ClientQuery.Active then
begin
ClientQuery.CreateTableAs(FInternalClientQuery, [mtcpoStructure]);
ClientQuery.Open;
ClientQuery.CopyRawRecords(FInternalClientQuery,FInternalClientQuery.RecordCount,[]);
// ClientQuery.LoadFromDataSet(FInternalClientQuery, [mtcpoStructure]);
end
else
begin
Log.TimeStart('CopyRawRecords');
ClientQuery.CopyRawRecords(FInternalClientQuery,-,[mwucAutoUTF8,mwucStringsIsUnicode,mwucAutoParamUTF8]);
// Log.TimeLapse('CopyRawRecords','CopyRawRecords用时:');
// ClientQuery.LoadFromDataSet(FInternalClientQuery, [mtcpoAppend]);
Log.TimeEnd('CopyRawRecords','CopyRawRecords用时:');
end; finally
ClientQuery.EnableVersioning:=origEnableVersioning;
ClientQuery.AutoPopulateOnOpen := OrigAutoPopulate;
ClientQuery.AutoFieldDefsOnOpen := OrigAutoFieldDefs;
ClientQuery.EnableEvents;
ClientQuery.EnableControls;
end;

先说说实际的应用场景,ClientQuery是一个没有字段定义的数据集,当客户端从服务端取得生成的数据流,并加载到FInternalClientQuery中,然后再复制到ClientQuery中,当第一次ClientQuery无字段定义时,我们需要从FInternalClientQuery复制结构给ClientQuery。当第二次取服务端取得FInternalClientQuery内容时,我们再追加到ClientQuery中,这时候,就不用再管他的结构了。

可以你要问,这么做干嘛?还不是为了分页查询,一页一页的为ClientQuery加载记录。

当复制结构时,要做二件事:

ClientQuery.AutoPopulateOnOpen := false;//Open时不自动填充记录
ClientQuery.AutoFieldDefsOnOpen := mwafoNever;//Open时不自动取得表结构

加载记录时,还要做二件事:

ClientQuery.DisableEvents;//屏蔽触发数据集事件,如OnNewRecord...
ClientQuery.EnableVersioning:=False;//因为CopyRawRecords内部已经处理了,这里可以不再处理

然后,用CreateTableAs建立结构,并打开ClientQuery,再调用CopyRawRecords复制记录到ClientQuery:

ClientQuery.CreateTableAs(FInternalClientQuery, [mtcpoStructure]);
ClientQuery.Open;
ClientQuery.CopyRawRecords(FInternalClientQuery,FInternalClientQuery.RecordCount,[]);

当ClientQuery有结构时,可以直接把FInternalClientQuery内容追加到ClientQuery中:

ClientQuery.CopyRawRecords(FInternalClientQuery,-,[mwucAutoUTF8,mwucStringsIsUnicode,mwucAutoParamUTF8]);

我做了效率测试,CopyRawRecords比LoadFromDataSet快三倍以上。

总结来说,为了使用CopyRawRecords,我们要先建立好ClientQuery的结构,为了按源DataSet创建结构,可以使用CreateTableAs方法,但使用这个方法时,我们要设置AutoPopulateOnOpen及AutoFieldDefsOnOpen两个属性,不允许自动填充记录及不自动获取结构,另外,使用CreateTableAs后,ClientQuery是不Open的,需要手工Open。

kbmMW CopyRawRecords 用法的更多相关文章

  1. kbmMW Scheduler.InAMoment用法

    kbmMW Scheduler提供了一个方法InAMoment,由于没有找到调用的例子,只好查看代码,原来这个方法与RunNow差不多,是立即执行一个方法,并且在主线程中. Scheduler.InA ...

  2. KBMMW SampleService/SampleClient方式传输数据集

    马上周末了,趁着下午这会儿回顾一下这几天对旧项目的升级过程,一些重要但不常用的东西记录下来是很有必要的.其中一个项目中对KBMMW的远程数据通讯方式做了改进,利用SampleService/Sampl ...

  3. 使用kbmMWConfiguration 让 kbmmw smartservice 更聪明

    以前的文章介绍了 很多 kbmmw smartservice 的使用,尤其是 rest 服务,所有的的配置都是通过 开发时写编码实现的,这样就可能导致,针对不同的应用环境,我们要重新编译代码,当然也可 ...

  4. REST easy with kbmMW #17 – Database 6 – Existing databases

    kbmMW已经包含了非常精细的功能来确定和解释数据库中表的元数据. 在下一版本中,这个功能将得到进一步加强,可以导入现有数据库中的表,自动创建与表相匹配的ORM实体类. 这意味着你能够使用kbmMW的 ...

  5. REST easy with kbmMW #16 – Multiple servers using HTTP.sys transport

    前文写过使用HTTP.sys转输层(TkbmMWHTTPSysServerTransport),实现一个kbmMW应用服务器. 如果在一台服务器上,同时运行多个,基于TkbmMWHTTPSysServ ...

  6. kbmMW随机数与强密码

    kbmMW随机数生成器 为了使基于kbmMW开发的项目更安全,其又提供了随机数及强密码生成实现类,拿来即用,让人感觉真是站到巨人的肩膀上好干活! 随机数方面,kbmMW分别提供32及64位的随机数生成 ...

  7. ClientAsTemplate用法

    kbmMW提供了TkbmMWClientQuery查询组件,作为kbmMW开发者都知道,这是一个内存数据集,基于服务端的查询服务(Query Service),可以直接执行sql得取想要的记录,因为是 ...

  8. Debugging memory usage with kbmMW

    kbmMW的更高版本包含越来越多的功能,可用于通常的日志记录,审计,运行期发生异常时的堆栈跟踪以及现在的内存使用调试.这些功能实际上可用于任何应用程序,不仅限于基于kbmMW开发的多层应用系统.我已经 ...

  9. 利用Delphi-cross-socket 库提升kbmmw 跨平台开发

    以前我写过了,通过httpsys 提升windows 下,delphi 多层应用.随着delphi 10.2 对linux 的支持,很多人也想在linux 下 发布kbmmw 服务器,但是官方仅通过i ...

随机推荐

  1. P4-Related Tools Installation

    P4-Related Tools Installation 安装P4相关工具的步骤和说明. 本说明只适用于 Ubuntu 14.04 系统. 推荐安装的其他工具 mininet:SDN网络仿真工具 v ...

  2. codeforces 351 div2 C. Bear and Colors 暴力

    C. Bear and Colors time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  3. XML_CPP_资料_libxml2库函数详解

    http://blog.csdn.net/hanchaoman/article/details/42557195 许多事物符合80/20法则,libxml中也是20%的函数提供了80%的功能.下面的列 ...

  4. 《A_Pancers》第一次作业:团队亮相

    一.团队及团队成员介绍 1> 队名:A_Pancers 2> 团队成员组成: 201571030310/龙正圆(小组长) 201571030329/杨环宇      20157103030 ...

  5. Android Fragment与Activity通讯详解

    与activity通讯 尽管fragment的实现是独立于activity的,可以被用于多个activity,但是每个activity所包含的是同一个fragment的不同的实例. Fragment可 ...

  6. ngIf 和 template的结合使用

    前提: 当遇到 一个种情况,一个元素中既可以显示 一个字符串变量,也可以显示一个模板 实现: // html <span class="ant-alert-message" ...

  7. JSON自定义排序

    var json=[{ Name:'张三', Addr:'重庆', Age:'20' },{ Name:'张三3', Addr:'重庆2', Age:'25' },{ Name:'张三2', Addr ...

  8. English trip -- Phonics 5 元音字母 o

    Vowel 元音 元音 O Consonant 辅音 清辅音   h    wh 浊辅音  m    wh  n   ng   y oa:[əʊ]  # 字母本身音 coat boat load co ...

  9. A Creative Cutout CodeForces - 933D (计数)

    大意:给定$n$个圆, 圆心均在原点, 第$k$个圆半径为$\sqrt{k}$ 定义一个点的美丽值为所有包含这个点的圆的编号和 定义函数$f(n)$为只有$n$个圆时所有点的贡献,求$\sum_{k= ...

  10. 安装torch-opencv

    安装torch-opencv torch torch-opencv opencv-3.1.0 opencv-contrib 想在torch中使用光流法,于是就希望能够调用opencv中的光流代码,而t ...