kbmMW—实现主从关系表的方法

环境:delphi XE10.2.2+kbmMW5.02+uniDac7.02+FB3.0

在日常应用中,我们经常会用到主/(Master/Detail)关系表,如客户与订单、角色与权限等。在kbmMW中实现Mater/Detail关系表的方法有两种,各有优缺点。下面是我实现这两个方法的过程。

首先,我对kbmMW是不了解的,并受到之前开发的影响,一直认为在客户端一个数据集控件(TkbmMWClientQuery)必须在服务器端有一个(TkbmMWUNIDACQuery)与之联系,结果我的问题变成了怎么在服务器端使两个TkbmMWUNIDACQuery共存并分别响应客户端的请求。

……

后来得红鱼儿大侠指导,才知道在服务器端用一个TkbmMWUNIDACQuery就足以响应客户端的请求了。一切才恢复到我的问题上来。

主从关系表的实现在kbmMW中有例子和说明文档。我照着做了,但是却还是遇到问题。下面就将这个过程说一下。

kbmMW的说明文档中明确说明,kbmMW实现主从关系表有两种方法:

一、第一种方法

当主关系表中的记录变化时,数据库将查询出与之相应的从关系表数据。

优点:

会得到最新的从表数据;

每次只传送与主表相匹配的从表数据;

缺点:

每次主表的记录变化时,都需要调用应用服务器或数据库。当然,如果不想这样,也可以启用从表中的缓存,在缓存中检索从表数据。

实现方法:

创建一个主关系表控件。如。可以是TkbmMWClientQuery并命名为:“kcqMaster”。

或者任何其他TkbmMWxxxxQuery

创建一个从关系表控件。如。可以是TkbmMWClientQuery并命名为:“kcqDetail”。

或者任何其他TkbmMWxxxxQuery

到底是TkbmMWClientQuery还是TkbmMWxxxxQuery取决于它是在客户端还是服务器端的主从关系表查询控件。

设置以下属性:

kcqMaster.Query.Text:= ‘select * from customers’;

kcqDetail.Query.Text:=' select * fromorders where CustomerID=:CustomerID ';

-kcqDetail中的CustomerID参数,通过Params属性定义为ftInteger字段类型和ptInput参数类型。

注意:有一点必须强调,上述SQL语句中,参数:CustomerID必须与从表中的字段名(CusstomerID)相同,如果不相同,kbmMW就不认了。也就找不出相应的从表数据。

-添加一个TDatasource,如。dsMaster,并将其数据集属性连接到kcqMaster

- kcqDetail.MasterSource:= dsMaster;

- kcqDetail.MasterFields:='ID';//这是主表中唯一的关键字段,用于搜索详细记录。如果有多于一个字段,可以通过(;)分号来分隔各个字段;

- kcqDetail.DetailFields:='CustomerID';//这是在从表上的字段,用于查找与特定主表记录匹配的从表记录。同样,如果多于一个字段,也是用(;)分号来分隔。

- kcqDetail.RequeryDetails:= true;//该属性用于当主表记录更改时,将对从表数据进行重新获取。

 

二、第二种方法

这种方法一次性从数据库中将主从表数据都下载到客户端,当主表记录更改时,kbmMW自动过滤掉与当前主表记录无关的从表数据。

优点:

在所有的主从表记录被获取之后,浏览主表非常快。从应用程序服务器或数据库中不需要再进行额外的数据请求。

它允许公文包主/从关系模式。这意味着您可以存储主从关系表数据在本地文件中,断开与网络的连接,你的主/从关系表仍然可用。

缺点:

所有主表记录的所有从表记录都需要打开。

你可能不会在任何时候都有详细记录的最新副本。

实现方法:

同样,在客户端或是服务器端创建两个代表主、从关系表的查询控件。kcqMasterkcqDetail

设置以下属性:

kcqMaster.Query.Text:= ‘select * from customers’;

kcqDetail.Query.Text:=' select * from orders ';

-添加一个TDatasource,如。dsMaster,并将其数据集属性连接到kcqMaster

- kcqDetail.MasterSource:= dsMaster;

- kcqDetail.MasterFields:='ID';//这是主表中唯一的关键字段。

- kcqDetail.DetailFields:='CustomerID';//这是应该在细节表上的字段。

kcqDetail.RequeryDetails:= false;//该入属性在每次主记录更改时将在从表内容中过滤不用的数据。

 

我想:这两种实现主/从关系表的方法各有优缺点,要选用哪种,看具体情况而定,如果数据从较多的,那还是采用第一种办法的好;如果数据比较少的,那采用第二种方法,将所有数据下载到本地也不是什么问题。

 

参考文档:

Master/Detail the kbmMW way forkbmMW v. 1.xx》Kim Madsen(kbmMW作者)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
winxp+delphi7+kbmmw4.0.3+unidac+mssql2000+dbgrideh 基本实现xalion中所说的功能并加上自己的一些编写经验 1、远程方法调用 2、取图像(流的使用) 3、查询数据 4、编辑数据:增、删、改(如果操作错误会进行相应的提示) 5、存储过程使用方法(存储过程参数自动创建) 6、动态创建数据集并执行Insert操作 7、命名查询(namedQuery) 8、事务操作(直接写SQL语句更新的事务操作,有个重要的属性要设置,否则会更新不成功) 9、使用的数据库:sqlserver 2000,请到服务器的FDM单元把连接参数改下 10、数据库kbm_test结构参见:kbm_test.sql 11、安装kbmMw时请把配置文件 kbmMWConfig.inc中 {$DEFINE KBMMW_UNIDAC_SUPPORT} // UNIDAC support. 前面的//去掉 12、使用delphi7 2012年8月新增功能与说明 1、客户端断线重连:kbmMWTCPIPIndyClientTransport1.MaxRetries := 2;//重连一次 2、对象传输 3、JSON传输(利用kbmmw带的json库实现) 4、客户端断开代码: if FDM.kbmMWSimpleClient1.Transport.IsConnected then begin //memo1.Lines.Add('程序已有300秒没有进行操作,断开连接'); FDM.kbmMWSimpleClient1.Disconnect; end; 5、新增远程过程调用函数(直接SQL语句操作数据库): startTran:启动事务 commitTran:提交事务 rollbackTran:回滚事务 openSql:打开SQL语句 execSql:执行SQL语句 注openSql、execSql两个函数体代码使用对象连接池技术,无对象创建与释放,以提高系统效率, 具体能提高多少,未实测 6、增加HTTP协议例子(参考资料:kbmMW_and_AJAX.pdf),提供http-get的功能,http-post的功能可参照http-get方法实现 7、提供数据集转json与json转数据集 (CDSFromJSon(CDS:TClientDataSet;JsonStr:string):Boolean)单元:uDBJson.pas 参照代码可自行把json转kbmmwQuery kbmmw编译unidac方法: 修改单元kbmMWUNIDAC.pas,本人在数据库中很少用到blob字段,所以在代码里屏蔽掉blob字段的处理, 经测试数据库字段类型为Text时,程序可以正常处理 报OLE DB error occured. CoInitialize has not been called (server)错误解决: unidac41src\Source\UniProviders\SQLServer\OLEDBAccessUni.pas constructor TOLEDBConnection.Create; begin inherited; CoInitialize(nil);//加此句 FCommand := nil; ... end; destructor TOLEDBConnection.Destroy; begin Disconnect; FCommand.Free; CoUninitialize;//加此句 inherited; end; 作者:chensm@vip.qq.com kbmmw开发交流群:209321818

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值