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关系中,只提取与主数据集中的当前记录对应的记录。因此,在某些情况下,这可以减少网络流量。

相关推荐
全栈老石19 小时前
拆解低代码引擎核心:元数据驱动的"万能表"架构
数据库·低代码
倔强的石头_2 天前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou643 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤4 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区5 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1775 天前
《从零搭建NestJS项目》
数据库·typescript
加号36 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏6 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐6 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再6 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip