using System.Data.OleDb;
var conn = new OleDbConnection(connectionString);
conn.Open();
Provider=MSDAORA;Data Source=MyTest;Host=192.168.1.1;User Id=system;Password=xxx
| 參數 | 說明 |
|---|---|
| Provider | 固定 MSDAORA (Microsoft OLE DB Provider for Oracle) |
| Host | Oracle Server IP,非預設 Port 需加 Port=xxxx |
| Data Source | Oracle Service Name / SID (tnsnames.ora 別名或 Easy Connect 字串) |
| User Id / Password | 資料庫帳密 |
缺少 Client 會拋出:The Oracle(tm) client and networking components were not found
tnsping 應成功回應。Windows Server 2003 防火牆開放 1521,抓包發現 Client 連上 1521 後,Listener 分配**隨機 Port** (如 1197) 給專用 Server Process,隨機 Port 被防火牆阻擋 → 連線逾時 (ORA-12535 / TNS-12535)。
listener.ora 設定 USE_SHARED_SOCKET = TRUE (Windows)。dispatchers 參數啟用共享伺服器模式。參考:KB 823973
Windows 防火牆支援**針對特定執行檔開放所有 Port**:
oracle.exe (通常在 $ORACLE_HOME\bin\)
⚠️ 僅適用 Windows 防火牆;硬體防火牆/第三方防火牆需設定 Port 範圍或共享伺服器模式。
| 端點 | 設定位置 | 建議值 |
|---|---|---|
| Client (應用程式機) | 登錄表 | SIMPLIFIED CHINESE_CHINA.ZHS16GBK |
| Server (Oracle DB) | 資料庫參數 / 環境變數 | SIMPLIFIED CHINESE_CHINA.ZHS16GBK |
登錄表路徑 (視 Oracle 版本):
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0\NLS_LANGHKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDb10g_home1\NLS_LANG修改後**重啟應用程式/連線池**生效。
| 問題 | 原因 | 解決 |
|---|---|---|
| ORA-12154: TNS could not resolve | tnsnames.ora 未設定 / 路徑錯誤 | 設定 TNS_ADMIN 環境變數或使用 Easy Connect: Host:Port/ServiceName |
| ORA-12514: Listener does not know service | Service Name 拼寫錯誤 / Listener 未註冊 | 檢查 lsnrctl status、DB service_names 參數 |
| 中文問號/亂碼 | NLS_LANG 不匹配 / 字元集轉換遺失 | 雙端統一 ZHS16GBK 或 AL32UTF8 (需 Client 10g+) |
| 連線緩慢 (10-30 秒) | DNS 反查逾時 / IPV6 干擾 | Listener.ora 加 INBOUND_CONNECT_TIMEOUT=0、Client 關閉 IPV6 |
OleDb + MSDAORA 屬舊技術棧,**新專案強烈建議使用 Oracle 官方 ODP.NET Managed Driver (NuGet: Oracle.ManagedDataAccess)**:
Data Source=host:port/service;User Id=...;Password=....NET 連 Oracle 核心在於:**Client 安裝、連接字串正確、防火牆處理動態 Port、字元集雙端一致**。掌握這四點,即可解決 90% 連線問題。新專請直接採用 ODP.NET Managed,避開 OleDb 歷史包袱。