首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

ODAC 應用技巧 (三):Master/Detail 主從表雙重綁定模式實戰

     編輯:Oracle 資料庫基礎

前言

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;

核心約定

  • 從表 SQL 參數名 必須等於 主表對應欄位名 (此例皆為 DEP_NO)。
  • 參數名區分大小寫 (Oracle 參數不區分,但 ODAC 內部匹配區分)。
  • 自動外鍵填充:向從表 Insert 新記錄時,ODAC 自動從主表當前記錄取得 Dep_No 值填入從表 Dep_No 欄位。

三、模式二:MasterFields/DetailFields 屬性模式 (欄位名不一致)

場景:從表外鍵欄位命名為 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 指定目標欄位)
適用場景標準命名、簡單主從欄位名不一致、複合鍵、多層主從

四、進階:多層主從 (Grandmaster → Master → Detail)

// 第三層:員工技能
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;

五、常見問題與避坑

  1. 從表不自動重查:檢查 Detail.MasterSource 是否正確指向;主表 AfterScroll 事件是否被攔截。
  2. 參數名大小寫不匹配:Oracle 參數不區分大小寫,但 ODAC 內部字串比對區分。統一用大寫欄位名/參數名。
  3. 複合主鍵綁定:Detail.MasterFields := 'Key1;Key2' (分號分隔),從表 SQL 需 WHERE key1 = :Key1 AND key2 = :Key2。
  4. 唯讀主表導致從表無法插入:主表需處於 dsEdit/dsInsert 狀態或已 Post,從表才能取得有效主鍵值。

六、總結

ODAC 雙模式 Master/Detail 綁定滿足從「標準命名」到「複雜欄位映射」的全場景需求。選擇原則:欄位名一致、簡單主從 → 參數綁定模式 (零配置);欄位名不一致、複合鍵、多層主從 → MasterFields/DetailFields 模式 (顯式映射)。掌握自動外鍵填充行為與 MasterSource 事件流向,即可構建穩健的主從表 UI。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved