主从模式(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) 学习笔记(三)TOraSession(3)

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

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

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

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

    1.SQL相关 名称 类型 说明 BaseSQL String 没有被AddWhere.SetOrderBy.FilterSQL等方法处理过的原始SQL语句 FinalSQL String 被AddW ...

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

    2.连接相关 名称 类型 说明 Connection 指向一个数据库连接对象 Disconnected 设置为True将在数据库关闭后继续保持数据集的开启状态. 3. 数据获取 名称 类型 说明 Fe ...

  5. ODAC (V9.5.15) 学习笔记(二十一)数据复制

    用TVirtualTable在内存中缓存TOraQuery中的数据,主要应用场景是参照其他数据,需要将TOraQuery中的数据复制到TVirtualTable,由于没有类似于TClientDataS ...

  6. windows内核开发学习笔记十七:IRP 和 IO_STACK_LOCATION 的交互

    windows内核开发学习笔记十七:IRP 和 IO_STACK_LOCATION 的交互 前面两篇学习笔记分别介绍了IRP和IO_STACK_LOCATION,整个设备栈来处理这个IRP,但是每个设 ...

  7. PowerDesigner 15学习笔记:十大模型及五大分类

    原文:PowerDesigner 15学习笔记:十大模型及五大分类 个人认为PowerDesigner 最大的特点和优势就是1)提供了一整套的解决方案,面向了不同的人员提供不同的模型工具,比如有针对企 ...

  8. Polyworks脚本开发学习笔记(十七)-制作宏脚本自定义工具条

    Polyworks脚本开发学习笔记(十七)-制作宏脚本自定义工具条 做好的宏脚本程序,每次打开脚本加载程序太多麻烦,为了方便的调用脚本做各种操作,可以使用系统的自定义工具条功能将脚本加载到工具条上. ...

  9. OpenCV学习笔记(十七)——K均值聚类

    当我们要预测的是一个离散值时,做的工作就是"分类".机器学习模型还可以将训练集中的数据划分为若干个组,每个组被称为一个"簇(cluster)".它的重要特点是在 ...

最新文章

  1. Visual Transformers: Token-based Image Representation and Processing for Computer Vision
  2. android apk签名工具_Android 应用修改为系统签名的方法(macOS)
  3. DL之CNN:利用自定义DeepConvNet【7+1】算法对mnist数据集训练实现手写数字识别并预测(超过99%)
  4. 日常检查IBM P系列小型机状态的项目及其相关命令
  5. 模型优化:BatchNorm合并到卷积中
  6. asp.net MVC 中使用dataannotation验证Model
  7. 解决VM虚拟机鼠标闪烁的问题
  8. python echarts教程_ECharts 入门教程
  9. 世界前五大IT咨询公司
  10. Phython画星空(较复杂)
  11. linux -m32,32位gcc和64位gcc与-m32选项有什么区别?
  12. svn: E155019: Can't upgrade as it is not a pre-1.7 work解决办法
  13. 七、基础教程-坐标轴(Axis)
  14. #ASM 翻译系列第二十五弹:ASM 高级知识 When will my rebalance complete
  15. 高德3D动态地图—旋转视角
  16. B2C电子商务能否通吃线上线下?
  17. 基于单片机的八路温度采集系统设计(#0446)
  18. 基于stm32f1(正点原子)的tft_lcd(ILI9341)学习
  19. 黑色简约多功能工具箱去水印外卖流量主小程序源码
  20. 异星工厂怎么用计算机,异星工厂新手入门打造超级自动科研系统十大技巧

热门文章

  1. python程序实例电话本-Python示例
  2. guava中的Splitter
  3. for循环:用turtle画一颗五角星
  4. 练习题 James and Dominoes
  5. 洛谷P3388 【模板】割点(割顶)
  6. ORACLE SQL语句总结2
  7. Java--FutureTask原理与使用(FutureTask可以被Thread执行,可以被线程池submit方法执行,并且可以监控线程与获取返回值)...
  8. PLSQL Developer 常用设置及快捷键
  9. jQuery EasyUI API 中文文档 - 日期框(DateBox)
  10. NET MVC3 中的枚举多语言实现,DescriptionPairAttribute