Master/Detail (主從表) 是資料庫應用最核心的 UI 模式。ODAC 提供兩種綁定機制:參數綁定模式 (傳統、通用) 與 MasterFields/DetailFields 屬性模式 (靈活、支援欄位名不一致)。本文以 Department/Employee 經典模型完整演示雙模式實作細節與自動外鍵填充行為。
-- 主表:部門
CREATE TABLE department (
dep_no NUMBER PRIMARY KEY,
dep_name VARCHAR2(50),
location VARCHAR2(50)
);
-- 從表:員工
CREATE TABLE employee (
emp_no NUMBER PRIMARY KEY,
emp_name VARCHAR2(50),
job VARCHAR2(30),
manager NUMBER,
dep_no NUMBER REFERENCES department(dep_no) -- 外鍵
);
procedure TForm1.FormCreate(Sender: TObject);
var
Master, Detail: TOraQuery;
MasterSource: TDataSource;
begin
// 1. 建立主資料集
Master := TOraQuery.Create(Self);
Master.SQL.Text := 'SELECT * FROM department';
Master.Name := 'qryDept';
// 2. 建立從資料集 — WHERE 條件使用參數 :Dep_No
Detail := TOraQuery.Create(Self);
Detail.SQL.Text := 'SELECT * FROM employee WHERE dep_no = :Dep_No';
Detail.Name := 'qryEmp';
// 3. 透過 TDataSource 連結
MasterSource := TDataSource.Create(Self);
MasterSource.DataSet := Master;
Detail.MasterSource := MasterSource; // 關鍵:設定 MasterSource
// 4. 開啟資料集
Master.Open;
Detail.Open; // 自動依 Master 當前記錄的 Dep_No 過濾
end;
DEP_NO)。Insert 新記錄時,ODAC 自動從主表當前記錄取得 Dep_No 值填入從表 Dep_No 欄位。場景:從表外鍵欄位命名為 DEP_LINK 而非 DEP_NO,參數綁定模式無法自動填充。
procedure TForm1.FormCreate(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 條件!
// 關鍵:明確指定主/從關聯欄位
Detail.MasterFields := 'Dep_No'; // 主表主鍵欄位
Detail.DetailFields := 'Dep_Link'; // 從表外鍵欄位
MasterSource := TDataSource.Create(Self);
MasterSource.DataSet := Master;
Detail.MasterSource := MasterSource;
Master.Open;
Detail.Open;
end;
| 特性 | 參數綁定模式 | MasterFields 模式 |
|---|---|---|
| 從表 SQL | 需含 WHERE :Param | 不可含 WHERE (ODAC 自動加篩選) |
| 欄位名需求 | 參數名 = 主表欄位名 | 可不同,靠屬性映射 |
| 自動外鍵填充 | 支援 (同名欄位) | 支援 (靠 DetailFields 指定目標欄位) |
| 適用場景 | 標準命名、簡單主從 | 欄位名不一致、複合鍵、多層主從 |
// 第三層:員工技能
Detail2 := TOraQuery.Create(Self);
Detail2.SQL.Text := 'SELECT * FROM emp_skill WHERE emp_no = :Emp_No';
Detail2.MasterSource := DetailSource; // 以員工資料集為 Master
Detail2.MasterFields := 'Emp_No'; // 可省略,若參數名同名
Detail2.Open;
Detail.MasterSource 是否正確指向;主表 AfterScroll 事件是否被攔截。Detail.MasterFields := 'Key1;Key2' (分號分隔),從表 SQL 需 WHERE key1 = :Key1 AND key2 = :Key2。dsEdit/dsInsert 狀態或已 Post,從表才能取得有效主鍵值。ODAC 雙模式 Master/Detail 綁定滿足從「標準命名」到「複雜欄位映射」的全場景需求。選擇原則:欄位名一致、簡單主從 → 參數綁定模式 (零配置);欄位名不一致、複合鍵、多層主從 → MasterFields/DetailFields 模式 (顯式映射)。掌握自動外鍵填充行為與 MasterSource 事件流向,即可構建穩健的主從表 UI。