结果是否相同?因为我尝试过,除了在DataSet中我没有看到任何变化,我可以在表格中编写查询/命令,我只能选择表格。
答案 0 :(得分:1)
我试过,除了在DataSet中我没有看到任何变化,我可以写一个 在表I中查询/命令只能选择表。
您的观察结果大致正确,因为您需要知道特定的表类型是否支持在Master-Detail关系的Detail侧使用,如果支持,则如何配置它。
Delphi有各种各样的表格后代 数据库类型,例如适用于(废弃的)BDE,适用于ADO的TADOTable等。它们是否支持在Master-Detail的Detail端 关系取决于特定表类型的作者,因此也是如此 您需要做什么才能获得给定的表类型来处理Detail数据集行为。
以Delphi' ssupplied ADO组件为例,如果您使用的是TADOQuery 作为Detail数据集,您为它编写SQL以包含链接的WHERE子句 主数据集,如
`where masterid = :masterid`
adnd将其DataSource
属性设置为连接到Master表的数据源。
要使用TADODataSet作为详细信息,存在只能(轻松)设置的问题 (详细信息)表名称,而不是检索来自它的哪些记录以匹配主行。 TADOTable的作者选择解决这个问题的方式是
提供您使用的TADOTable
MasterFields
和MasterSource
属性
将ADOTable链接到主数据集
将基础Filter
对象的RecordSet
属性用于过滤器表达式
除了匹配的详细记录以外的所有内容。请参阅ADODB.Pas中的procedure TCustomADODataSet.ActivateTextFilter
。
示例项目:
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
qMaster: TADOQuery;
qDetail: TADOQuery;
dsMaster: TDataSource;
tDetail: TADOTable;
procedure FormCreate(Sender: TObject);
public
end;
[...]
procedure TForm1.FormCreate(Sender: TObject);
begin
qMaster.Connection := AdoConnection1;
qMaster.SQL.Text := 'select * from master';
qDetail.Connection := AdoConnection1;
qDetail.SQL.Text := 'select * from detail where masterid = :masterid';
qDetail.DataSource := dsMaster;
// tDetail is a TADOTable
tDetail.Connection := AdoConnection1;
tDetail.TableName := 'detail';
tDetail.MasterSource := dsMaster;
tDetail.MasterFields := 'MasterID';
qMaster.Open;
qDetail.Open;
tDetail.Open;
end;