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 ...
随机推荐
- caffe在Linux下生成均值文件
参照博客:https://blog.csdn.net/sinat_28519535/article/details/78533319
- DX9 空间坐标变换示例代码
// @time 2012.3.25 // @author jadeshu #include <Windows.h> #include <d3d9.h> #include &l ...
- python -- 判断给定的参数是否是地理位置的经度和纬度
例子: coordinates = "2.3,-8ui" 无效地理位置 coordinates = "2.3,-8i" 有效地理位置 方法一:使用try...e ...
- E. Gerald and Giant Chess
E. Gerald and Giant Chess time limit per test 2 seconds memory limit per test 256 megabytes2015-09-0 ...
- python中装饰器修复技术
python装饰器@wraps作用-修复被装饰后的函数名等属性的改变 Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变), 为了 ...
- 世界最顶级邮件服务器组合Linux + PMTA + OEMPRO,PowerMTA 安装
世界最顶级邮件服务器组合Linux + PMTA + OEMPRO PowerMTA 安装 PMTA + OEMPRO 这个是发送的组合 PMTA提供的SMTP,OEMPRO是订阅管理以及邮件的过滤 ...
- centos6.8卸载DB2 10.5
1.卸载实例 Ø 使用Root用户登陆 cd /opt/ibm/db2/V9.5/instance/ ./db2idrop db2inst1 ./dasdrop db2inst1 2.卸载db2 Ø ...
- C#发送邮件异常:根据验证过程,远程证书无效,何解???
/// <summary> /// 发送邮件 /// </summary> /// <param name="mailSubjct">邮件主题& ...
- vue editorConfig
在文件目录下, indent_size = 2设置为4
- Kali linux创建和删除用户
#创建用户 图形界面如此友好,直接点用户——添加用户——设置密码即可,如果切换帐号,同样点用户——切换用户——输入密码即可. #删除用户的指令比较复杂一些,这里我们找到了特别好的资源,简明有效. ht ...