傳統 ODAC 透過 OCI 庫 (需安裝 Oracle Client) 連線資料庫。ODAC Net 選項採用純 TCP/IP 協議直連 Oracle Listener,完全免安裝 Oracle Client,大幅降低部署體積與維護成本。本文詳細說明 Net 模式架構、連線字串格式、啟用代碼、OCI vs Net 差異、限制與適用場景。
| 層面 | OCI 模式 (標準) | Net 模式 (直連) |
|---|---|---|
| 通訊層 | OCI (Oracle Call Interface) + SQL*Net | 原生 TCP/IP Socket |
| Client 安裝 | 需完整/Instant Client | 零安裝 |
| 部署體積 | ~100MB+ (Instant Client) | ~2MB (ODAC 核心組件) |
| 加密/認證 | Oracle Native Encryption / SSL / Kerberos | DES 加密 (僅認證階段),不支援 Oracle 加密套件 |
| 功能支援 | 完整 (Object、Collection、LOB、AQ、TAF 等) | 受限 (見下文限制表) |
var
Session: TOraSession;
begin
Session := TOraSession.Create(nil);
try
Session.Options.Net := True; // 關鍵:啟用 Net 模式
Session.Username := 'scott';
Session.Password := 'tiger';
Session.Server := '192.168.1.100:1521:ORCL'; // 格式: Host:Port:SID
// 或 Service Name: '192.168.1.100:1521/mypdb.example.com'
Session.Connect;
// ... 業務邏輯
finally
Session.Free;
end;
end;
Host:IP 或主機名 (支援 IPv6 格式 [::1])。Port:Listener 埠 (預設 1521)。SID / Service_Name:Instance 識別碼。建議使用 Service Name (支援 RAC/PDB)。// 運行時動態切換
Session.Options.Net := False; // 切回 OCI 模式
Session.Server := 'ORCL_TNS'; // TNS 別名
Session.Connect;
應用其餘代碼 (Query、Transaction 等) 完全無需修改,僅連線建立階段不同。
| 功能 | Net 模式支援 | 備註 |
|---|---|---|
| TCP/IP 連線 | ✅ 唯一支援協議 | 不支援 IPC、Named Pipes、SDO 等 |
| Oracle 8/9/10/11/12/19c | ✅ Windows/Linux 測試通過 | 不保證所有平台/版本相容 |
| Object Type / Collection (VARRAY/Nested Table) | ❌ 不支援 | 需 OCI |
| LOB (BLOB/CLOB/BFILE) 串流存取 | ❌ 受限 | 建議 OCI 模式處理大物件 |
| TOraLoader 直接路徑載入 (lmDirect) | ❌ 不支援 | 僅支援常規路徑 |
| BreakExec (中斷長時間執行) | ❌ 無效 | |
| TRUNC(:bind) 日期截斷比較 | ❌ 報 ORA-00932 | 已知 Bug,改用應用層截斷 |
| NLS 客戶端轉換 | ⚠ 部分支援 | 不支援完整 Client 端 NLS 轉換 |
| 防火牆/NAT 環境 | ⚠ 可能有認證問題 | 需開放 Listener Port 直通 |
IF (部署環境無法安裝 Client) OR (極度壓縮部署體積) OR (簡單 CRUD 應用)
AND NOT (需 Object/Collection/大型 LOB/直接路徑載入/高階加密/TAF)
THEN
使用 Net 模式
ELSE
使用標準 OCI 模式
END IF;
ODAC Net 模式以 Session.Options.Net := True + Host:Port:SID 連線字串,實現真正的「零 Client 部署」。但功能限制明確:無 Object/Collection、無高階加密、無直接路徑載入、LOB 受限。架構決策時務必對照限制表,確認業務功能落在支援範圍內再採用。混合部署策略:核心服務用 OCI,邊緣輕量工具用 Net,同一專案內運行時動態切換。