在主/详细信息关系上使用DataSet和Table之间的区别?

时间:2017-05-18 06:32:05

标签: delphi

结果是否相同?因为我尝试过,除了在DataSet中我没有看到任何变化,我可以在表格中编写查询/命令,我只能选择表格。

1 个答案:

答案 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 MasterFieldsMasterSource属性 将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;