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