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

64 位元 Windows 伺服器透過 ODBC 連線 32 位元 Oracle:架構衝突、驅動選擇與編譯目標平台解決方案

     編輯:Oracle 資料庫基礎

問題背景

  • 應用伺服器:Windows Server 2008 R2 / 2012 R2 (x64)
  • Oracle 資料庫:32 位元 Oracle Client (10g/11g)
  • 應用程式:.NET (C#) 使用 System.Data.Odbc
  • 現象:本機 (x86) 測試正常,部署至 x64 伺服器報錯 「未指定驅動程式名稱及預設資料來源」 (ERROR [IM002])。

根因分析

  1. ODBC 驅動程式位元數必須與進程位元數一致:64 位元進程只能載入 64 位元 ODBC 驅動;32 位元進程只能載入 32 位元驅動。
  2. 預設 Any CPU 編譯在 x64 OS 上會以 64 位元進程執行,嘗試載入 64 位元 Oracle ODBC 驅動,但機器上僅安裝 32 位元 Oracle Client → 找不到驅動。
  3. 32 位元 Oracle Client 安裝的 ODBC 驅動註冊在 HKLM\SOFTWARE\Wow6432Node\ODBC\ODBCINST.INI,64 位元 ODBC 管理員 (odbcad32.exe) 看不到。

解決方案對比

方案操作優點缺點
強制 x86 編譯 (推薦)專案屬性 → Build → 取消「Prefer 32-bit」或勾選「Prefer 32-bit」/ 目標平台 x86零程式碼修改、相容現有 32 位元驅動、最快落地進程限制 4 GB 記憶體、無法享用 64 位元效能
安裝 64 位元 Oracle Client + ODBC下載 64 位元 Instant Client + ODBC 套件,建立 64 位元 System DSN原生 64 位元、記憶體無上限需額外授權/下載、雙維護
使用 ODP.NET Managed DriverNuGet 安裝 Oracle.ManagedDataAccess,免 Client、純 .NET、跨平台最佳現代方案、無位元數問題、效能優需改寫資料存取層 (OdbcConnection → OracleConnection)
COM+ / WCF 代理將 32 位元資料存取封裝為 32 位元 COM+ 應用程式,64 位元主程式跨程序呼叫不改主程式架構複雜度高、序列化開銷、維護難

方案一:強制 x86 編譯 實作步驟


# Visual Studio 專案屬性
右鍵專案 → Properties → Build
☑ Prefer 32-bit (Visual Studio 2012+)
# 或
Platform target: x86

重新建置部署,進程將以 WoW64 模式執行,可正常載入 32 位元 Oracle ODBC 驅動。

ODBC 設定細節

  1. 執行 32 位元 ODBC 管理員:C:\Windows\SysWOW64\odbcad32.exe
  2. 系統 DSN → 新增 → Oracle in OraClient11g_home1 (或對應 Home 名稱)
  3. Data Source Name: DSN_JIARUI
  4. TNS Service Name: JIARUI2 (對應 tnsnames.ora 別名)
  5. User ID / Password: guide
  6. 測試連線 → 成功

tnsnames.ora 範例


JIARUI2 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.30.12)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )

.NET 連線字串


string connStr = "DSN=DSN_JIARUI;UID=guide;PWD=guide;";
using (var conn = new OdbcConnection(connStr)) {
    conn.Open();
    // 後續 OdbcCommand / OdbcDataAdapter 操作
}

驗證進程位元數


# 程式碼中列印
Console.WriteLine("Is64BitProcess: " + Environment.Is64BitProcess); // 應為 False

最佳實踐建議

  1. 新專案優先採用 ODP.NET Managed Driver,徹底解決位元數與 Client 部署問題。
  2. 存量專案若無法重寫,強制 x86 編譯為最低成本方案。
  3. 文件化記錄 ODBC DSN 名稱、驅動版本、tnsnames.ora 位置,納入部署清單。
  4. 定期更新 Oracle Client / ODP.NET 至最新補丁組 (RU/RUR),修復安全性與相容性問題。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved