kbmMW CopyRawRecords 用法
复制一个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 用法的更多相关文章
- kbmMW Scheduler.InAMoment用法
kbmMW Scheduler提供了一个方法InAMoment,由于没有找到调用的例子,只好查看代码,原来这个方法与RunNow差不多,是立即执行一个方法,并且在主线程中. Scheduler.InA ...
- KBMMW SampleService/SampleClient方式传输数据集
马上周末了,趁着下午这会儿回顾一下这几天对旧项目的升级过程,一些重要但不常用的东西记录下来是很有必要的.其中一个项目中对KBMMW的远程数据通讯方式做了改进,利用SampleService/Sampl ...
- 使用kbmMWConfiguration 让 kbmmw smartservice 更聪明
以前的文章介绍了 很多 kbmmw smartservice 的使用,尤其是 rest 服务,所有的的配置都是通过 开发时写编码实现的,这样就可能导致,针对不同的应用环境,我们要重新编译代码,当然也可 ...
- REST easy with kbmMW #17 – Database 6 – Existing databases
kbmMW已经包含了非常精细的功能来确定和解释数据库中表的元数据. 在下一版本中,这个功能将得到进一步加强,可以导入现有数据库中的表,自动创建与表相匹配的ORM实体类. 这意味着你能够使用kbmMW的 ...
- REST easy with kbmMW #16 – Multiple servers using HTTP.sys transport
前文写过使用HTTP.sys转输层(TkbmMWHTTPSysServerTransport),实现一个kbmMW应用服务器. 如果在一台服务器上,同时运行多个,基于TkbmMWHTTPSysServ ...
- kbmMW随机数与强密码
kbmMW随机数生成器 为了使基于kbmMW开发的项目更安全,其又提供了随机数及强密码生成实现类,拿来即用,让人感觉真是站到巨人的肩膀上好干活! 随机数方面,kbmMW分别提供32及64位的随机数生成 ...
- ClientAsTemplate用法
kbmMW提供了TkbmMWClientQuery查询组件,作为kbmMW开发者都知道,这是一个内存数据集,基于服务端的查询服务(Query Service),可以直接执行sql得取想要的记录,因为是 ...
- Debugging memory usage with kbmMW
kbmMW的更高版本包含越来越多的功能,可用于通常的日志记录,审计,运行期发生异常时的堆栈跟踪以及现在的内存使用调试.这些功能实际上可用于任何应用程序,不仅限于基于kbmMW开发的多层应用系统.我已经 ...
- 利用Delphi-cross-socket 库提升kbmmw 跨平台开发
以前我写过了,通过httpsys 提升windows 下,delphi 多层应用.随着delphi 10.2 对linux 的支持,很多人也想在linux 下 发布kbmmw 服务器,但是官方仅通过i ...
随机推荐
- POJ 3162 Walking Race(树形dp+单调队列 or 线段树)
http://poj.org/problem?id=3162 题意:一棵n个节点的树.有一个屌丝爱跑步,跑n天,第i天从第i个节点开始跑步,每次跑到距第i个节点最远的那个节点(产生了n个距离),现在要 ...
- UVa 11572 唯一的雪花(滑动窗口)
https://vjudge.net/problem/UVA-11572 题意:输入一个长度为n的序列A,找到一个尽量长的连续子序列,使得该序列中没有相同的元素. 思路:很简单的题,也没啥好解释的了. ...
- python分享题目
目前的分享题目:1 python在云计算虚拟教室领域的应用 2 python与虚拟货币(华三工程师) 3 python在移动游戏的实践(爪子) 4 python互联网敏捷运维实践(蓝雪) 5 pyth ...
- go 接口
1. package main import ( "fmt" ) type Phone interface { call() } type NokiaPhone struct { ...
- Java DecimalFormat的主要功能及使用方法
DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字.该类设计有各种功能,使其能够分析和格式化任意语言环境中的数,包括对西方语言.阿拉伯语和印度语数字的支持. ...
- react新的生命周期
一. react16当前生命周期 componentWillMountrender前,所以setState不会重新渲染,服务端渲染唯一调用,推荐用constructor代替之 render compo ...
- php.ini配置说明
1.设置时区为中国时区 date.timezone = PRC 2.设置支持MySql数据 extension=php_pdo_mysql.dll 直接将这个注释打开就OK了 3.让PHP支持简写&l ...
- [.NET开发] C# 如何更改Word语言设置
一般在创建或者打开一个Word文档时,如果没有进行过特殊设置的话,系统默认的输入语言的是英语输入,但是为适应不同的办公环境,我们其实是需要对文字嵌入的语言进行切换的,因此,本文将介绍如何使用Spire ...
- Android Studio apk打包,keystore.jks文件生成,根据keystore密钥获取SHA1安全码
keystore.jks文件生成,打包APK 选择Build > Generate Signed APK 出现如下弹框: 然后点击Create new...(创建的意思)出现另一个弹框,在做如下 ...
- android--------验证码倒计时
在我们注册或者修改信息的时候,常会用到60s倒计时这个功能,写了这篇文章,大家共享一下: 效果图: 直接上代码: activity.java public class MainActivity ext ...