DataSnap ClientdataSet 三层中主从表的操作
非原创 摘自:http://hi.baidu.com/yagzh2000/blog/item/fc69df2cb9845de78b139946.html
三层中主从表的操作(删除、新增、修改)一定要在一个事物中完成,那在Delphi中的事物又如何控制呢?我们在开发客户端时,如果为了在一个事物中而用TSqlConnection的事物来控制是徒劳的,没有一点意义,因为真正事物控制是在服务端的TDataSetProvider中产生的,它是自动产生事物的,如果有错误产生,它会回滚事物。
当客户端的ClientdataSet把Delta数据提交给远程的DataSetProvider时,这个DataSetProvider会解析这个语句,并且会自动产生一个事物,所以我们不必要写事物控制,当然用函数时而不用DataSetProvider是另外一个话题。
如果我们直接在远程端设置二个TDataSetProvider,客户端也放两个对就的ClientDataSet,并把客户端的两个数据集设置成主从可以吗?
我的回答是:绝对不可以。为什么?因为你在更新数据时是在两个DataSetProvider中产生二个不同的事物,这样的话就不能保证数据更新的完整性。
Delphi为我们提供的机制是在服务端设置好主从结构,而从表数据集变为主表的一个字段,这样当客户端连接远程的TDataSetProvider时,只把客户端主表数据控件连接到DataSetProvider就可以,从表只要设置一下DataSetField为客户端主表中那个数据集字段就可以了。当保存数据时,只用客户端主表的ApplyUpdata就可以保存主从表数据(可以有多个从表)。更新时就把主从表相关改动的数据传到远程 的DataSetProvider中,些时DataSetProvider可以开启一个事物,这样就能保证数据的完整性。
以下我详细说一下开发主从表的实例:
我用的数据集是:UniDac,它和Ado基本一样用(用mssql2000 northwind 库中的orders和order detail表做实例)
一.开发服务端
1. 放上连接数据库的控件:UniConnection.和MSSQL驱动控件SQLServerUniProvider1(ADO不需要)
2. 放上主表数据集UniQuery1改为名称 是Master,设置它的sql语句为:Select * From Orders
3. 放上主表数据集对应的DataSource,更名为DSMaster,设置这个数据源是为了让从表和它关联
4. 放上从表数据集UniQuery改为名称是Detail,设置它的Sql语句为:Select * from [Order Detail] where orderid=:A(这个形参可以随意设置)
5.设置Detail的MasterSource为DSMaster。再点选Detail属性MasterFields,在弹出的对话框中把主从表的主键及子表的外键关联起来。这样就构成了主从关系结构。
6.在Master的AfterScroll事件中对Detail中的参数A赋值
procedure TForm1.MasterAfterScroll(DataSet: TDataSet);
begin
Detail.Close;
Detail.Params[0].Value:=DataSet.FieldByName('orderid').AsInteger;
Detail.Open;
end;
7.放入名为DSP的DataSetProvider控件,设置其DataSet为Master,并设置ResloveToDataSet为Ture,为Ture表示数据的处理交由和DataSetProvider的数据集来处理,可以处理多表的数据,为False表示产生的数据是由DataSetProvider的内置Sql分析器来处理 ,但不能处理多表数据。且记一定要打开。其它的属性根据需要打开。
下图为从表设置 的MaserFields属性

二,客户端设置(为了简便测试,故把服务端和客户端放在同一界面,所以不再设置ClientDataSet的RemoteServer属性)
1.放入名为Main的ClientdataSet控件。
2.设置ClientDataSet的ProviderName为服务端的DSP.
3.在Main上打开字段属性编辑器,并在编辑器中加入服务器端Master语句产生的字段
下图为Main上的字段,你会发现有一个Detail的字段,它就是从表数据集,做为一个主表的字段了

4.再加入一个名为Child的ClientDataSet控件,它就是在客户端的从表数据集控件。
5. 设置Child的DataSetField为"MainDetail",这是可选的,即它的数据是从Main数据集的Detail字段中得到的,其它的都不用设置。
如下图
6.分别放两个DataSource和DBgrid,并分别连接到Main和Child数据集和DBGrid中,这样就可以显示数据。
此时,我们就设置好了主从关系,你可以放上一些按钮Open.代码为:Main.Open.你就会发现当客户端主表开启时,从表也跟着开启
如下图

你可以更改、删除、新增了。当然你要控制一下自增主键,这个不再多说。
还有一个发现的情况是服务端数据子表的ObjectView属性,当设置Detail的ObjectView为True时,则子表的 SQL语句中不用参数,如:Select * from [Order Detail]即可,当然那个主表数据集Master的AfterScroll中的代码就不用要了,其它都不要改变,这样的话也可以和 上面一样的操作。这个属性现在还不知是什么东东,请知道的告知一下,谢谢。
Ado中没有这个属性,但SqlQuery中有ObjectView这个属性,我发现这个属性挺重要的
另就是LookUp字段,如果要让客户端选择的话,则是在客户端的Child中设置它的LookUp字段,而在服务端设置成LookUP字段,则在客户端只显示而不能选择;
DataSnap ClientdataSet 三层中主从表的操作的更多相关文章
- 【EF学习笔记10】----------主从表级联操作
主从表 级联新增 Console.WriteLine("=========主从表 级联新增=========="); using (var db = new Entities()) ...
- Winform界面中主从表编辑界面的快速处理
在Winform开发中,我们往往除了常规的单表信息录入外,有时候设计到多个主从表的数据显示.编辑等界面,单表的信息一般就是控件和对象实体一一对应,然后调用API保存即可,主从表就需要另外特殊处理,本随 ...
- ORACLE数据导入导出后新数据库中某些表添加操作报错[ORA-12899]
由于项目需要,我在搭建了新的开发环境后,需要将之前环境中的ORACLE数据库导出,再导入到新的开发环境下.当导出导入完成后,使用数据库进行添加操作时 发现针对很多表的添加操作报错,具体报错原因描述为: ...
- C++Builder中注册表的操作
僮骶头浅5募虻チ耍旅嫖揖鸵砸桓鍪道此得鱐Registry类的用法.首先,先介绍一下TRegistry的属性和方法:TRegistry类一共有四个属性.属性 类型 描述CurrentKey int ...
- oracle中有关表的操作
在Oracle中查看所有的表: select * from tab/dba_tables/dba_objects/cat; 看用户建立的表 : select table_name from user_ ...
- PostgreSQL中的表连接操作
- 代码生成工具Database2Sharp中增加视图的代码生成以及主从表界面生成功能
在代码生成工具的各种功能规划中,我们一向以客户的需求作为驱动,因此也会根据需要增加一些特殊的功能或者处理.在实际的开发中,虽然我们一般以具体的表进行具体业务开发,但是有些客户提出有时候视图开发也是很常 ...
- ASPxGridView中如何对主从表绑定数据
注:在从表的aspxgridview中的(OnDataBinding()事件中绑定数据)-----代码如下 //绑定属性值表protected void grid2_sonTable_DataBind ...
- 在GridControl表格控件中实现多层级主从表数据的展示
在一些应用场景中,我们需要实现多层级的数据表格显示,如常规的二级主从表数据展示,甚至也有多个层级展示的需求,那么我们如何通过DevExpress的GridControl控表格件实现这种业务需求呢?本篇 ...
随机推荐
- 「loj3057」「hnoi2019」校园旅行
题目 一个n个点m条边的无向图,每个点有0 / 1 的标号; 有q个询问,每次询问(u,v)直接是否存在回文路径(可以经过重复的点和边); $1 \le n \le 5 \times 10^3 , ...
- A1032. Sharing
To store English words, one method is to use linked lists and store a word letter by letter. To save ...
- JS面试题(二)(常见算法编程)
1.字符串转驼峰 例如:border-bottom-color ----> borderBottomColor var str="border-bottom-color"; ...
- ArrayList创建步骤及基本方法
ArrayList创建变量的步骤 ArrayList ------>集合 1: 导入包 java.util.ArrayList包中 2: 创建引用类型的变量 数据类型< 集合存储的数据类型 ...
- 在Linux上安装Elasticsearch Head工具.md
在Linux上安装Elasticsearch Head工具 1.修改elasticsearch的参数 编辑elasticsearch的配置文件elasticsearch.yml $ vim /data ...
- CPU温度问题
台式机和笔记本的CPU温度多少合适,过高会怎样, cpu温度跟环境温度有很大关系,夏天的时候会高一点的.一般CPU空闲的时候温度在50°以内,较忙时65°以内,全速工作时75°以内都是正常的,所以我们 ...
- python---RabbitMQ(3)exchange中关键字发送direct(组播)
设置关键字,交换机根据消费者传递的关键字判断是否与生产者的一致,一致则将数据传递给消费者 可以实现对消息分组 生产者: # coding:utf8 # __author: Administrator ...
- dubbo面试问题
为什么用微服务: 为什么zookeeper能作为注册中心: 使用分布式碰到的bug, zookeeper有集群吗?怎么实现的: zookeeper宕机还能访问吗: 服务失效踢出zookeeper中临时 ...
- html5 实时监听输入框值变化的完美方案:oninput & onpropertychange
结合 HTML5 标准事件 oninput 和 IE 专属事件 onpropertychange 事件来监听输入框值变化. H5手机端: <input type="text" ...
- PB9.0数据窗口入门
因为工作的关系,最近公司用PB比较多,至少10年没用过PB了,回顾一下数据窗口使用方法.1.代码结构 2.数据窗口 3.代码窗口代码 APP入口代码 4.需要使用DataBase插入一条数据 5.执行 ...