C# 專案操作 Oracle 資料庫常用 ODP.NET,但部署時因作業系統位元數、是否安裝 Oracle Client、版本相容性等問題頻發。本文總結實務中驗證可行的部署策略:連接字串標準、32/64 位元配置、免安裝客戶端 (XCopy) 部署、組件綁定重導向、VC++ 執行階段相依。
<connectionStrings>
<add name="OracleDB"
connectionString="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=DB_IP)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=SVC_NAME)));User Id=usr;Password=pwd;Min Pool Size=10;Connection Lifetime=120;Connection Timeout=60;Incr Pool Size=5;Decr Pool Size=2"
providerName="Oracle.DataAccess.Client" />
</connectionStrings>
ODTwithODAC1120320_32bit (含 ODP.NET、Oracle Client)Oracle.DataAccess.dll,無額外配置關鍵:web.config/app.config 加入組件綁定重導向,解決版本衝突:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89b483f429c47342" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.121.1.0" newVersion="4.121.1.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
注意: 64 位系統必須使用 64 位版 Oracle.DataAccess.dll 及對應 Oracle Client。
將以下 5 個核心檔案置於應用程式根目錄 (bin 資料夾):
oci.dllOracle.DataAccess.dllorannzsbb11.dlloraociei11.dllOraOps11w.dllconfig 檔註冊 DbProviderFactory:
<system.data>
<DbProviderFactories>
<add name="Oracle Data Provider for .NET"
invariant="Oracle.DataAccess.Client"
description="Oracle Data Provider for .NET"
type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=4.112.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</DbProviderFactories>
</system.data>
OracleConnection myConn = new OracleConnection(connStr); myConn.Open(); // 自動建立/使用連接池
連接字串參數控制池行為:Min Pool Size、Max Pool Size、Connection Lifetime、Incr/Decr Pool Size。
| 錯誤現象 | 原因與解決 |
|---|---|
| 底層異常無法捕捉、啟動失敗 | 缺少 VC++ 執行階段。安裝 vc2008redist 或 vc2010redist (x86/x64 對應) |
| ORA-12154 / TNS 無法解析 | 連接字串使用 SID 但服務端為 SERVICE_NAME。改用 SERVICE_NAME=xxx 或 Data Source=TNS_ALIAS |
| BadImageFormatException | 32/64 位不匹配。專案目標平台 (x86/x64/AnyCPU) 必須與 ODP.NET DLL 位元數一致 |
| DLL 找不到 / 版本衝突 | 免安裝部署缺少 5 核心檔;或 GAC 中殘留舊版。清理 GAC、確認 bin 目錄檔案完整 |