复制一个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. HDU 6127 Hard challenge(扫描线)

    http://acm.hdu.edu.cn/showproblem.php?pid=6127 题意: 有n个点,每个点有一个$(x,y)$坐标和一个权值,任意两点之间都有连线,并且连线的权值为两个顶点 ...

  2. Mui --- 弹出菜单

    mui框架内置了弹出菜单插件,弹出菜单显示内容不限,但必须包裹在一个含.mui-popover类的div中,如下即为一个弹出菜单内容: <div id="popover" c ...

  3. python 将16进制转化为2进制

    >>> x='123abc' >>> b=bin())[:] >>> print(b)

  4. Java实现邮箱激活验证

    最近从项目分离出来的注册邮箱激活功能,整理一下,方便下次使用 RegisterValidateService.java [java] view plaincopyprint?   package co ...

  5. STL_算法_05_集合算法

    ◆ 常用的集合算法: 1. 1.1.第6讲 PPT.40 ◆ set_union() :  构造一个有序序列,包含两个有序序列的并集. 1.2.第6讲 PPT.40 ◆ set_intersectio ...

  6. 探秘AOP实现原理

    可以这么说,AOP是基于动态代理实现的. 那么,这个过程是怎样的? 首先,我们有这样的一个Service类,它是被作为切面的一个类: public class Service implements U ...

  7. 【Robot Framework 项目实战 01】使用 RequestsLibrary 进行接口测试

    写在前面 本文我们一起来学习如何使用Robot Framework 的RequestsLibrary库,涉及POST.GET接口测试,RF用例分层封装设计等内容. 接口 接口测试是我们最常见的测试类型 ...

  8. react新的生命周期

    一. react16当前生命周期 componentWillMountrender前,所以setState不会重新渲染,服务端渲染唯一调用,推荐用constructor代替之 render compo ...

  9. C#对config配置文件的管理

    应用程序配置文件,对于asp.net是 web.config,对于WINFORM程序是App.Config(ExeName.exe.config). 配置文件,对于程序本身来说,就是基础和依据,其本质 ...

  10. mount ntfs-3g , fstab里的配置没有效果

    把ntfs-3g配置在 fstab 里,mount 时会报 No such device 网上也有在嵌入式系统里发生的类似例子. 没有解决方法,也不准备再研究了. 准备在机器启动之后,手动下面的命令 ...