在主/细节关系上使用数据集和表之间的区别?



结果是一样的吗?因为我尝试过,除了在数据集中之外,我没有看到任何变化,我可以在表上编写查询/命令,我只能选择表。

我试过了,除了在数据集中之外,我没有看到任何变化,我可以写一个 查询/命令在表上时 I 只能选择表。

您的观察大致正确,因为您需要知道特定表类型是否支持在主-细节关系的"详细信息"端使用,如果支持,如何配置它。

德尔福有各种表状后代 数据库类型,例如(过时的)BDE 的 TTable、ADO 的 TADOTable 等。 他们是否支持在大纲细节的"细节"端 关系取决于特定表类型的作者,也是如此 获取给定表类型以处理详细信息数据集行为需要执行的操作。

以德尔福提供的ADO组件为例,如果您使用的是TADOQuery 作为详细信息数据集,您为其编写 SQL 以包含链接的 WHERE 子句 数据集到主数据库,如

`where masterid = :masterid`

adnd 将其DataSource属性设置为连接到主表的数据源。

要使用TADODataSet作为详细信息,存在您只能(轻松)设置的问题 (详细信息)表名,而不是从中检索哪些记录以匹配主行。 TADOTable的作者选择解决这个问题的方式是

  • 提供用于TADOTableMasterFieldsMasterSource的属性 将 ADOTable 链接到主数据集

  • 将基础RecordSet对象的Filter属性用于筛选表达式 这将筛选出除匹配的详细信息记录之外的所有记录。 请参阅 ADODB 中的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;

最新更新