兩個表之間的主/明細表關系應用非常廣泛。因此為數據庫應用程序開發人員提供簡單的方法來實現它是非常重要的。讓我們看看如何實現這項功能。
假如我們在 "Department" 和 "Employee" 之間建立了主/明細表關系。"Department" 表包含以下字段: DepNo, DepName 和 Location。DepNo 是一個數字型的主鍵,其它兩個字段是字符串類型。
"Employee" 表包含以下字段: EmpNo, EmpName, Job, Manager 和 DepNo。 EmpNo 和 DepNo 是數字型字段, EmpName 和 Job 是字符串型字段。EmpNo 是一個主鍵且 DepNo 是一個綁定 "Employee" 和 "Department" 的外鍵。
這是顯示和編輯數據表所必需的。
ODAC 提供了兩種綁定數據表的方法。第一個代碼例子顯示了通過參數綁定兩個 TOraDataSet 組件 (TOraQuery, TSmartQuery, TOraTable 或 TOraStoredProc) 到主/明細關系中。
procedure TForm1.Form1Create(Sender: TObject);
var
Master, Detail: TOraQuery;
MasterSource: TDataSource;
begin
// 創建主數據集
Master := TOraQuery.Create(Self);
Master.SQL.Text := 'SELECT * FROM Department';
// 創建明細數據集
Detail := TOraQuery.Create(Self);
Detail.SQL.Text := 'SELECT * FROM Employee WHERE DepNo = :DepNo';
// 主表通過 TDataSource 組件來連接明細表
MasterSource := TDataSource.Create(Self);
MasterSource.DataSet := Master;
Detail.MasterSource := MasterSource;
// 打開主數據集和明細數據集
Master.Open;
Detail.Open;
end;
注意一件事情:明細數據集的SQL語句中的參數名必須等於主數據集中用作明細表外鍵的字段名。在打開明細表數據集後,其數據總是等於當前主數據集記錄字段(比如 DepNo)所限定的值。
有一個額外的功能:當向明細表數據集插入新記錄時,它自動從主表中獲取相應值來填充其外鍵的值。
現在,假如明細表 "Department" 的外鍵被命名為 DepLink 而不是 DepNo. 在這種情況下,上面的代碼例子中當插入記錄時,明細表數據集將不會自動填充當前的 DepNo 到當前的 DepLink 字段。這個問題可以用第二個代碼例子來解決:
procedure TForm1.Form1Create(Sender: TObject);
var
Master, Detail: TOraQuery;
MasterSource: TDataSource;
begin
// 創建主數集
Master := TOraQuery.Create(Self);
Master.SQL.Text := 'SELECT * FROM Department';
// 創建明細數據集
Detail := TOraQuery.Create(Self);
Detail.SQL.Text := 'SELECT * FROM Employee';
// 設置主/明細表
Detail.MasterFIElds := 'DepNo'; // primary key in Department
Detail.DetailFIElds := 'DepLink'; // foreign key in Employee
// 主表通過 TDataSource 組件連接明細表
MasterSource := TDataSource.Create(Self);
MasterSource.DataSet := Master;
Detail.MasterSource := MasterSource;
// 打開主數據表和明細表
Master.Open;
Detail.Open;
end;
在這個代碼例子中,使用 MasterFields 和 DetailFIElds 屬性建立主/明細關系。注意:在明細表的SQL語句中不能有 WHERE 子句。