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

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

  1. ClientQuery.DisableControls;
  2. ClientQuery.DisableEvents;
  3. origEnableVersioning := ClientQuery.EnableVersioning;
  4. OrigAutoPopulate := ClientQuery.AutoPopulateOnOpen;
  5. OrigAutoFieldDefs := ClientQuery.AutoFieldDefsOnOpen;
  6. ClientQuery.AutoPopulateOnOpen := false;
  7. ClientQuery.AutoFieldDefsOnOpen := mwafoNever;
  8. ClientQuery.EnableVersioning:=False;
  9. try
  10. FInternalClientQuery.LoadFromStreamViaFormat(c.ResultStream, bsf);
  11. if not ClientQuery.Active then
  12. begin
  13. ClientQuery.CreateTableAs(FInternalClientQuery, [mtcpoStructure]);
  14. ClientQuery.Open;
  15. ClientQuery.CopyRawRecords(FInternalClientQuery,FInternalClientQuery.RecordCount,[]);
  16. // ClientQuery.LoadFromDataSet(FInternalClientQuery, [mtcpoStructure]);
  17. end
  18. else
  19. begin
  20. Log.TimeStart('CopyRawRecords');
  21. ClientQuery.CopyRawRecords(FInternalClientQuery,-,[mwucAutoUTF8,mwucStringsIsUnicode,mwucAutoParamUTF8]);
  22. // Log.TimeLapse('CopyRawRecords','CopyRawRecords用时:');
  23. // ClientQuery.LoadFromDataSet(FInternalClientQuery, [mtcpoAppend]);
  24. Log.TimeEnd('CopyRawRecords','CopyRawRecords用时:');
  25. end;
  26.  
  27. finally
  28. ClientQuery.EnableVersioning:=origEnableVersioning;
  29. ClientQuery.AutoPopulateOnOpen := OrigAutoPopulate;
  30. ClientQuery.AutoFieldDefsOnOpen := OrigAutoFieldDefs;
  31. ClientQuery.EnableEvents;
  32. ClientQuery.EnableControls;
  33. end;

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

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

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

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

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

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

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

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

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

  1. 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. 【Android实验】 UI设计-ListView

    目录 实验目的 实验要求 实验内容 实现效果 实验代码 实验总结 实验目的 学习使用ListView 学习使用menu 实验要求 实现一个列表,其中显示班级学号姓名,提供添加功能,如需要删去某一项,长 ...

  2. LA 3644 易爆物

    https://vjudge.net/problem/UVALive-3644 简单的并查集题目. #include<iostream> using namespace std; + ; ...

  3. Centos下挖XMR门罗币的详细教程

    很多朋友都看过我之前写的Ubuntu下挖XMR门罗币的教程,也有很多朋友提出,为什么不写个Centos的教程出来,今天我在这里就写个Centos的教程,看这个教程前,大家先看看之前的教程,因为里面涉及 ...

  4. easyui ---- jEasyUI-定制提示信息面板组件

    @{ ViewBag.Title = "Layouts"; Layout = "~/Views/Shared/Layouts.cshtml"; } <di ...

  5. Linux——用户管理简单学习笔记(一)

    Linux用户分为三种: 1:超级用户(root,UID=0) 2:普通用户(UID 500-60000) 3:伪用户(UID 1-499)  伪用户: 1.伪用户与系统和程序服务相关 :nbin.d ...

  6. python datetime模块来获取当前的日期和时间

    #!/usr/bin/python # -*- coding: UTF- -*- import datetime i = datetime.datetime.now() print ("当前 ...

  7. [源][osg][osgBullet]osgBullet例子介绍

    1.BasicDemo 基本样例 一个小玩具飞机坠落,一个立方体盒子在转圈 2.centerofmass 质心 3.collision 碰撞检测 这里有一个大神自己改的例子: http://blog. ...

  8. 【Golang 接口自动化04】 解析接口返回JSON串

    前言 上一次我们一起学习了如何解析接口返回的XML数据,这一次我们一起来学习JSON的解析方法. JSON(Javascript Object Notation)是一种轻量级的数据交换语言,以文字为基 ...

  9. Unity游戏中关于伤害范围的计算

    1.纯数学计算 范围计算 + 方向计算: 先将不在伤害范围的敌人排除掉,再计算处于伤害范围并且角度正确的敌人. 以上的计算是以人物的中心来计算的, 所以这中方式就有些局限性了,比如:一个四足怪物,只有 ...

  10. [Java学习] Java继承的概念与实现

    继承是类与类之间的关系,是一个很简单很直观的概念,与现实世界中的继承(例如儿子继承父亲财产)类似. 继承可以理解为一个类从另一个类获取方法和属性的过程.如果类B继承于类A,那么B就拥有A的方法和属性. ...