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

相关推荐
猫的玖月31 分钟前
(一)MY SQL概述
数据库·sql
脑子进水养啥鱼?1 小时前
PostgreSQL .history 文件
数据库·postgresql
倔强的石头_1 小时前
5 个真实案例带你避坑:DolphinDB 实时写入、流订阅与高可用调优
数据库
虹科网络安全1 小时前
艾体宝新闻|Redis 月度更新速览:2026 年 3 月
数据库·redis·缓存
Nturmoils1 小时前
DolphinDB 实时时序数据处理踩坑实录:5 类生产故障排查与优化
数据库
csdn2015_2 小时前
postgresql 拼接字段
数据库
\xin2 小时前
pikachu自编SQL(POST)
java·数据库·sql
2301_815901972 小时前
SQL如何将多行记录聚合成逗号分隔字符串_GROUP_CONCAT技巧
jvm·数据库·python
秋92 小时前
Kingbase下载、安装和使用详解
数据库
zjy277773 小时前
Layui tab选项卡如何动态根据ID值进行程序化切换
jvm·数据库·python