主从模式(Master/Detail mode)是指建立主表和从表关系的多个数据集集合模式。

1. 关系设置

要设置主从模式,必须有一个主表数据集(TDataSet)和一个从表数据集(TDataSet),且主表数据集关联一个数据源组件(TDataSource),并将从表数据集的MasterSource指向该数据源组件,最后设置关联字段。设置主从表之间关联字段有2种形式:

1、在从表数据集的SQL中设置外键,通过参数指向主表的字段,如:

//主表数据集

Master := TOraQuery.Create(Self);

Master.SQL.Text := 'SELECT * FROM Department';

//从表数据集

Detail := TOraQuery.Create(Self);

Detail.SQL.Text := 'SELECT * FROM Employee WHERE Dept_No = :Dept_No';

//设置数据源

MasterSource := TDataSource.Create(Self);

MasterSource.DataSet := Master;

Detail.MasterSource := MasterSource;

SQL中的冒号(:)代表后面为一个变量,且该变量的名称要与主表的主键字段保持一致。

2、设置从表的MasterFields和DetailFields属性,如:

//主表数据集

Master := TOraQuery.Create(Self);

Master.SQL.Text := 'SELECT * FROM Department';

//从表数据集

Detail := TOraQuery.Create(Self);

Detail.SQL.Text := 'SELECT * FROM Employee ';

//设置关联字段

Detail.MasterFields := 'Dept_No';     //主表主键

Detail.DetailFields := 'Dept_No '; //从表中对应主表主键的字段

//设置数据源

MasterSource := TDataSource.Create(Self);

MasterSource.DataSet := Master;

Detail.MasterSource := MasterSource;

2. 数据获取

主从模式数据获取有2种模式:

1、传统模式

传统模式下,主从关系的数据集获取数据时,先开启主数据集,针对主数据集的每一条记录,从数据集根据关联字段去获取相应的从表数据。这样最大的诟病是主数据集记录有多少条,就需要执行多少次从数据集的查询,效率非常低下。

2、本地模式(LocalMasterDetail)

ODAC特有的本地主从关系模式,将主表数据集和从表数据集的所有记录一次性从服务器上获取下来,然后根据主从关系设置在本地对从表数据集的记录进行过滤。这样做最大的好处是减少了对服务器的开销,尤其是主表记录非常多的情况下,数据库的SQL执行数量非常少,效率非常高。

传统模式和本地模式各有优缺点,真是“熊掌与鱼”的关系。2种模式的设置取决于主数据集的Options.LocalMasterDetail,如果为True表示本地模式,如果是False为传统模式。

3. 更新

主从关系数据集如果是通过TDataSetProvider一次性打包给TClientDataSet处理,就可以一次性提交服务器进行数据保存,不用考虑主从关系及事务处理。但是如果使用ODAC进行处理,主从关系数据集的更新存在2方面内容:

1、本地更新,即在本地的数据处理。

在缓冲模式下,从表的CachedUpdates属性只有在主表的选项LocalMasterDetail设置为True时才有效。无论是缓冲模式还是传统模式,本地更新时支持从表插入时自动填写对应主表数据集中关联字段的值,缺点是不支持级联删除和编辑,即删除主表记录时,从表记录不跟随级联删除,更改主表关联字段值时,从表对应字段值没发生变化。这一切需要代码自己控制。

2、远程更新,即将本地更新提交数据库保存。

无论是缓冲模式还是传统模式,远程更新提交数据库时,ODAC不支持类似于TClientDataSet的统一数据提交功能,必须由代码开启连接的事务,依次提交主表数据集和从表数据集的修改,其提交顺序由代码控制。这样做有个最大问题:插入新记录时需要先提交主表数据集,然后提交从表数据集,删除记录时,需要先提交从表数据集,然后再提交主表数据集,否则从表数据集会报外键约束错误。如果插入和删除动作同时存在,则会产生矛盾。通过连接组件的ApplyUpdates方法进行统一提交也存在上述问题。

解决的办法只能由客户端程序控制,修改一条主记录及其从记录,必须保存后才能进行其他主记录操作的方式。好在主从数据集需要同时操作和保存多条主记录的情况非常罕见,所以这个问题也就不是很大了,只是客户端的控制要做好。

ODAC(V9.5.15) 学习笔记(十七)主从模式的更多相关文章

  1. ODAC(V9.5.15) 学习笔记(一)总论

    一直在使用ODAC做开发,没时间仔细研究一下,目前采用的是3层结构,ODAC+TDataSetProvider+TClientDataSet做数据处理,也没有多大问题.下一步要开发B/S的程序了,打算 ...

  2. ODAC(V9.5.15) 学习笔记(十五)数据离线模式

    数据离线模式(Disconnected Mode)是指数据库只有在需要的时候才连接,数据的处理放在客户端内存缓冲区中完成.这样做最大的好处是减少了网络资源依赖,对数据库服务器的资源开销和压力也减少.如 ...

  3. ODAC(V9.5.15) 学习笔记(四)TCustomDADataSet(4)

    6.Options TCustomDADataSet的选择项为TDADataSetOptions,其成员介绍如下表 : 名称 类型 说明 TDADataSetOptions AutoPrepare B ...

  4. ODAC(V9.5.15) 学习笔记(三)TOraSession(3)

    3. 选项 TOraSession的Options有如下内容 名称 类型 说明 CharLength TCharLength 单个字符的长度,缺省0,表示从服务器获取对应的字符集中单个字符长度 Cha ...

  5. ODAC (V9.5.15) 学习笔记(二十)大数据量获取处理

    ODAC获取数据的效率比较高,在Web程序中希望能够更快获取第一页的数据时,可以有几种方式: 1.在数据库中进行分页处理: 2.获取所有数据,只是快速返回第一页数据. 第一种方案对应用服务器资源消耗最 ...

  6. ODAC(V9.5.15) 学习笔记(十九)主键值自动生成

    ODAC支持通过Oracle的序列来自动生成表的主键功能.这个过程允许在客户端自动完成,不需要过多代码.这个对一些要求自动增长字段做主键的场合非常有用.其实现步骤为: 1.数据库必须先建立生成主键的序 ...

  7. ODAC(V9.5.15) 学习笔记(十八) 数据集缓冲模式

    数据集的缓冲模式(Cached mode)是将数据库服务器的数据缓冲在客户端内存中进行处理,不再依赖服务器.只有当数据需要提交数据库服务器进行保存时,才将变更数据一次性提交数据库服务器. 数据集缓冲模 ...

  8. ODAC(V9.5.15) 学习笔记(十六)直接访问模式

    直接访问模式(Direct mode)是ODAC最大的特色之一,即不需要安装Oracle客户端,ODAC越过了OCI(Oracle Call Interface ),使用TCP/IP协议就可以直接与O ...

  9. ODAC(V9.5.15) 学习笔记(四)TOraDataSet

    名称 类型 说明 SequenceMode TSequenceMode ODAC可以直接利用Oracle中的序列对象为表的主键赋值,从而实现主键自动增长的功能.该属性决定了在什么场合下使用序列: sm ...

随机推荐

  1. 为什么不能把委托(delegate)放在一个接口(interface)当中?

    stackoverflow上有人问,为什么不能把委托放在一个接口当中? 投票最多的第一个答案第一句话说,“A Delegate is just another type, so you don't g ...

  2. 基于iscroll.js实现下拉刷新和上拉加载特效

    现在已经不是纯Android独霸天下的时代了,H5嵌入Android的Hybrid混合开发是大势所趋.今天给大家带来的就是移动端中常见的"上拉刷新,下拉加载"特效,这个特效将会基于 ...

  3. MySQL 存储过程 定时任务

    drop procedure if exists move_track_data; delimiter // create procedure move_track_data() begin ; st ...

  4. 《Web 开发基础》专题系列

      说在前头     Web的重要性我想不必我多说了,写这篇文章的目的主要是想分享一些我学习Web前端开发的知识积累,其中以JavaScript为主,比较适合新人看,也欢迎大牛们多多留言提提意见.   ...

  5. C语言实现单链表-03版

    在C语言实现单链表-02版中我们只是简单的更新一下链表的组织方式: 它没有更多的更新功能,因此我们这个版本将要完成如下功能: Problem 1,搜索相关节点: 2,前插节点: 3,后追加节点: 4, ...

  6. paip.spring 获取bean getBean 没有beanid的情况下

    paip.spring 获取bean  getBean 没有beanid的情况下 spring能自动扫描带有注解的bean文件.. 作者Attilax  艾龙,  EMAIL:1466519819@q ...

  7. paip.语义分析--单字词名词表

    paip.语义分析--单字名词表   INSERT INTO t (word)  SELECT DISTINCT word FROM `word_main` where tsisin is not n ...

  8. Atitit..文件上传组件选型and最佳实践总结(2)----断点续传

    Atitit..文件上传组件选型and最佳实践总结(2)----断点续传 1. 断点续传的原理 1 2. 如何判断一个插件/控件是否支持断点续传?? 1 3. 常用的组件选型结果::马 1 4. 自定 ...

  9. SHINY-SERVER R(sparkR)语言web解决方案 架设shiny服务器

    1. shiny server简介 shiny-server是一种可用把R 语言以web形式展示的服务,其实RStudio公司自己构建了R Shiny Application运行的平台(http:// ...

  10. web前端基础——初识HTML DOM编程

    1 HTML DOM编程概述 文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理HTML的标准编程接口.由于HTML文档被浏览器解析后就是一棵DOM树,要改 ...