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,采用代码方式获取。

时间: 2024-11-11 13:31:14

DataSnap下的分包获取的相关文章

基于opencv网络摄像头在ubuntu下的视频获取

 基于opencv网络摄像头在ubuntu下的视频获取 1  工具 原料 平台 :UBUNTU12.04 安装库  Opencv-2.3 2  安装编译运行步骤 安装编译opencv-2.3  参考http://blog.csdn.net/xiabodan/article/details/23547847 3  测试代码 编译 g++ cameraCaptrue.cpp -o test `pkg-config --libs --cflags opencv` cameraCaptrue.cpp

谷歌浏览器下jquery无法获取图片的尺寸解决方案

谷歌浏览器下jquery无法获取图片的尺寸解决方案: 本章节介绍一下在谷歌浏览器下利用jquery无法获取图片尺寸的现象,而在IE和火狐浏览器下能够正常获得,当然也不是任何时候都无法获取图片尺寸,下面就来介绍一下如何解决此问题. 代码如下: $(document).ready(function(){   var img_h=$img.height();    var img_w=$img.width();  }) 以上代码在IE和火狐中没有问题,但是在谷歌中可能会出现问题,之所以没货的尺寸就是因

路由机构 -- 下拉框获取当前所属部门

//下拉框获取当前所属部门 function initRespOrg(){   $.ajax({           type: "POST",            url: "/tms/actions/tms_net_org/localOrg.do?actionId=tms_net_org_localOrg",            dataType:"json",            data :"",       

windows和linux下如何远程获取操作系统版本和主机名

远程获取windows和linux操作系统版本和主机名需要具备以下条件: 假设 主机A(windows 7),ip:192.168.12.2 主机B(centos 6.3),ip:192.168.12.3 主机C(windows 2008)-为远程要获取信息的主机,ip:192.168.12.4 主机D(centos 6.3)-为远程要获取信息的主机,ip:192.168.12.5 windows: 1.主机A可以ping通主机C: 2.主机B可以ping通主机C: 3.主机B可以通过161端口

Linux下用C获取当前时间

Linux下用C获取当前时间,具体如下: 代码(可以把clock_gettime换成time(NULL)) ? 1 2 3 4 5 6 7 8 9 10 void getNowTime() {  timespec time;  clock_gettime(CLOCK_REALTIME, &time); //获取相对于1970到现在的秒数  tm nowTime;  localtime_r(&time.tv_sec, &nowtime);  char current[1024];  

win/linux 下使用 psutil 获取进程 CPU / memory / IO 占用信息

psutil - A cross-platform process and system utilities module for Python 1. 安装 pip 安装即可. windows 下需要安装 vs2008,否则报错: Unable to find vcvarsall.bat 如果已经安装 vs2010 / vs2012 则需要设置环境变量,VS90COMNTOOLS 指向已有的 vs 变量. vs2010 设置如下: VS90COMNTOOLS = %VS100COMNTOOLS%

C++ 下使用curl 获取ftp文件

从http://curl.haxx.se/下载的win32版本的curl都不能使,#include <curl.h>后总是报错:external symbol ,意思就是没有链接到curl的各种library,最后尝试了n多次终于成功了,希望大家以后少走弯路! 以Windows 8 64bit,Visual Studio 2012 为例: 1.获取curl: 从这里可以获得所有版本的curl,我下载的是Win32 - MSVC版本的curl,我下载的是MSVC 7.19.3 devl SSL

(转)LINUX下Live555不能获取ip地址解决方法

linux下运行live55 显 示如图 :没有获取ip:  ip是0.0.0.0 live555在不知道本地IP地址与网络接口的情况下,通过一个在本地某端口建立一个UDP连接,然后把这个UDP连接加入 到一个组播组 ,当然要对这个组播组进行相应的设置,比如TTL,回环等等:然后通过UDP连接发送一个数据:最后通过这个UDP连接接收这个数据,并且解析相应的发送地址:大概流程就是这样了. 具体的代码片段live555:groupsock/GroupsockHelper.cpp里:因此我们设置固定的

有关Linux下request.getRealPath(&quot;/&quot;)获取路径的问题

request.getRealPath("/") 在window获取的是服务器的根目录,结尾包含分隔符, 如E:\apache-tomcat-6.0.29-bak\apache-tomcat-6.0.29\apache-tomcat-6.0.29\webapps\test\ 在Linux下获取的不含分隔符,如: /home/weblogic/Desktop/PTYT/ptytNetpay/WebRoot 因此需要判断处理: String root = request.getRealPa