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

相关推荐
Morpheon3 小时前
SQL窗口函数中的排名函数详解:从基础到高级应用
数据库·sql·mysql
boonya3 小时前
Postgresql 如何开启矢量数据库扩展
数据库
熊文豪3 小时前
时序数据库选型指南:如何为企业选择合适的时序数据库解决方案
数据库·时序数据库·iotdb
码农学院3 小时前
MSSQL字段去掉excel复制过来的换行符
前端·数据库·sqlserver
jun~3 小时前
SQLMap数据库枚举靶机(打靶记录)
linux·数据库·笔记·学习·安全·web安全
计算机毕业设计小帅3 小时前
【2026计算机毕业设计】基于Springboot的娱乐网站设计与实现
数据库·课程设计
lang201509283 小时前
MySQL I/O容量调优终极指南
数据库·mysql
kobe_OKOK_4 小时前
mysql 创建容器和启动远程链接
数据库·mysql
lypzcgf4 小时前
Coze源码分析-资源库-删除数据库-后端源码-安全与错误处理
数据库·安全·coze·coze源码分析·智能体平台·ai应用平台·agent平台