UniDac控件关于主从表的创建

下文通过对UniDac帮助文件中创建主从表的内容进行翻译。

两个表之间的主/从(MD)关系非常普遍。因此,为数据库应用程序开发人员提供一种简单的方法来使用它非常重要。让我们来看看UniDAC是如何实现这一功能的。

假设我们在"部门"和"员工"表之间有经典的MD关系。

"部门"表有字段Dept_No。Dept_No是主键。

"员工"表具有主键EmpNo和外键Dept_No,将"员工"绑定到"部门"。

UniDAC提供了两种绑定表的方法。第一个代码示例显示了如何通过参数将两个TCustomUniDataSet组件绑定到MD关系中。

Delphi 复制代码
procedure TForm1.Form1Create(Sender: TObject);
var
  Master, Detail: TUniQuery;
  MasterSource: TDataSource;
begin
  // create master dataset
  Master := TUniQuery.Create(Self);
  Master.SQL.Text := 'SELECT * FROM Department';

  // create detail dataset

  Detail := TUniQuery.Create(Self);
  Detail.SQL.Text := 'SELECT * FROM Employee WHERE Dept_No = :Dept_No';

  // connect detail dataset with master via TDataSource component
  MasterSource := TDataSource.Create(Self);
  MasterSource.DataSet := Master;
  Detail.MasterSource := MasterSource;

  // open master dataset and only then detail dataset
  Master.Open;
  Detail.Open;
end;

注意一件事:从表数据集SQL中的参数名称必须等于主数据集中用作细节表外键的字段名称或别名。打开明细数据集后,始终保存Dept_No字段值等于当前主数据集记录中的记录。

还有一个附加功能:当向详细数据集插入新记录时,它会自动用从主数据集中获取的值填充外键字段。

现在假设从表"Department"外键字段名为DepLink,但不是Dept_No。在这种情况下,上述代码示例中描述的明细数据集将不会用当前的"Department"自动填充DepLink字段。插入时没有值。这个问题在第二个代码示例中得到了解决。

Delphi 复制代码
procedure TForm1.Form1Create(Sender: TObject);
var
  Master, Detail: TUniQuery;
  MasterSource: TDataSource;
begin
  // create master dataset
  Master := TUniQuery.Create(Self);

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

  // create detail dataset
  Detail := TUniQuery.Create(Self);
  Detail.SQL.Text := 'SELECT * FROM Employee';

  // setup MD
  Detail.MasterFields := 'Dept_No';   // primary key in Department
  Detail.DetailFields := 'DepLink'; // foreign key in Employee

  // connect detail dataset with master via TDataSource component
  MasterSource := TDataSource.Create(Self);
  MasterSource.DataSet := Master;

  Detail.MasterSource := MasterSource;

  // open master dataset and only then detail dataset
  Master.Open;
  Detail.Open;
end;

在这个代码示例中,MD关系是使用MasterFields和DetailFields属性设置的。还要注意,从表数据集SQL中没有WHERE子句。

要在主数据集导航时延迟刷新细节数据集,可以使用DetailDelay选项。

这种MD关系可以是本地和远程的,具体取决于TCustomDADataSet.Options.LocalMasterDetail选项。如果此选项设置为True,则数据集将使用本地筛选来建立主详细信息关系,而不引用服务器。否则,每次在主数据集中选择记录时,详细数据集都会执行查询。使用本地MD关系可以减少服务器呼叫次数并节省服务器资源。它对慢速连接很有用。缓存更新模式只能用于本地MD关系的详细数据集。当详细信息表包含太多行时,不建议使用本地MD关系,因为在远程MD关系中,只提取与主数据集中的当前记录对应的记录。因此,在某些情况下,这可以减少网络流量。

相关推荐
阿成学长_Cain35 分钟前
Linux ipcs 命令超全详解:查看共享内存 / 消息队列 / 信号量,IPC 运维必备
linux·运维·服务器·网络·数据库
OceanBase数据库官方博客3 小时前
OceanBase AI 时代,数据库的变与不变(技术解析与实践)
数据库·人工智能·oceanbase
阿成学长_Cain4 小时前
Linux dirs命令详解|Bash目录堆栈管理快速切换目录实战教程
linux·运维·前端·数据库
ywl4708120874 小时前
Mysql 平衡二叉树、红黑树、B树、B+树区别以及应用场景(五)
数据库·b树·mysql
IvorySQL5 小时前
IvorySQL Agent 探索与实践
数据库·人工智能·postgresql·oracle·ivorysql
SelectDB6 小时前
美团数十 PB 规模 Apache Doris 实践:从统一 OLAP 到 AI-Native 数据基座
大数据·数据库·性能优化
Database_Cool_6 小时前
阿里云RDS主从延迟解决方案_只读实例半同步复制最佳实践
数据库·人工智能
KaMeidebaby7 小时前
卡梅德生物技术快报|小 RNA 适配体合成 + 多方法亲和力表征全流程标准化操作手册
前端·网络·数据库·人工智能·算法
卓怡学长7 小时前
w269基于spring boot + vue 候鸟监测数据管理系统
java·数据库·spring boot·spring·intellij-idea
ClouGence7 小时前
MySQL 到 StarRocks 数据迁移同步:同步方案与实践指南
数据库·mysql