首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET 遠程連接 Oracle 實戰指南:OleDb、防火牆、字元集完整避坑

     編輯:關於.NET

連接架構:OleDb + MSDAORA Provider

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)
HostOracle Server IP,非預設 Port 需加 Port=xxxx
Data SourceOracle Service Name / SID (tnsnames.ora 別名或 Easy Connect 字串)
User Id / Password資料庫帳密

前置條件:必須安裝 Oracle Client

缺少 Client 會拋出:The Oracle(tm) client and networking components were not found

  • 下載 Oracle Instant Client (輕量版) 或完整 Oracle Client (含 Net Manager 設定工具)。
  • 安裝後驗證:tnsping 應成功回應。

防火牆陷阱:動態 Port 問題與兩種解法

現象

Windows Server 2003 防火牆開放 1521,抓包發現 Client 連上 1521 後,Listener 分配**隨機 Port** (如 1197) 給專用 Server Process,隨機 Port 被防火牆阻擋 → 連線逾時 (ORA-12535 / TNS-12535)。

解法一:共享伺服器 / Shared Sockets (標準做法)

  1. listener.ora 設定 USE_SHARED_SOCKET = TRUE (Windows)。
  2. dispatchers 參數啟用共享伺服器模式。
  3. 所有 Session 走同一 Port,防火牆只需開 1521。

參考:KB 823973

解法二:Windows 防火牆「依程式開放」 (快速臨時方案)

Windows 防火牆支援**針對特定執行檔開放所有 Port**:

  1. 控制台 → Windows 防火牆 → 例外 → 新增程式
  2. 選擇 oracle.exe (通常在 $ORACLE_HOME\bin\)
  3. 勾選「允許所有連接埠」
防火牆新增程式例外 允許所有連接埠

⚠️ 僅適用 Windows 防火牆;硬體防火牆/第三方防火牆需設定 Port 範圍或共享伺服器模式。

字元集亂碼:NLS_LANG 必須雙端一致

端點設定位置建議值
Client (應用程式機)登錄表SIMPLIFIED CHINESE_CHINA.ZHS16GBK
Server (Oracle DB)資料庫參數 / 環境變數SIMPLIFIED CHINESE_CHINA.ZHS16GBK

登錄表路徑 (視 Oracle 版本):

  • 9i: HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0\NLS_LANG
  • 10g/11g: HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDb10g_home1\NLS_LANG

修改後**重啟應用程式/連線池**生效。

進階避坑清單

問題原因解決
ORA-12154: TNS could not resolvetnsnames.ora 未設定 / 路徑錯誤設定 TNS_ADMIN 環境變數或使用 Easy Connect: Host:Port/ServiceName
ORA-12514: Listener does not know serviceService 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

現代替代方案:ODP.NET Managed Driver

OleDb + MSDAORA 屬舊技術棧,**新專案強烈建議使用 Oracle 官方 ODP.NET Managed Driver (NuGet: Oracle.ManagedDataAccess)**:

  • 零相依 Oracle Client (xcopy 部署)
  • 效能優於 OleDb、支援 EF Core、Async/Await
  • 連接字串相容 Data Source=host:port/service;User Id=...;Password=...

結語

.NET 連 Oracle 核心在於:**Client 安裝、連接字串正確、防火牆處理動態 Port、字元集雙端一致**。掌握這四點,即可解決 90% 連線問題。新專請直接採用 ODP.NET Managed,避開 OleDb 歷史包袱。

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