是的,Oracle 問題又來了!(沒錯,我桌子旁邊的羚羊又更多惹…)

Windows 2012R2 跑多個網站,從 ASP.NET 2.0、3.5、4.0 到 4.5.2 都有,還涉及多台 SQL、Oracle,Oracle 版本有舊有新,部分程式還用到了分散式交易。考慮 ODP.NET 12.1 無法與 Oracle 10.2 進行分散式交易,而新版共用元件多已改用 ODP.NET 12.1,只好 11.2、12.1 兩種版本 Oracle Client 都裝,並移除發行者原則檔,允許不同 ASP.NET 專案使用不同版本。

此種做法經驗證可行,但今天發現有台機器使用 ODP.NET 12.1 的網站卻冒出以下錯誤:

Unable to load DLL 'OraOps12.dll': The specified procedure could not be found. (Exception from HRESULT: 0x8007007E)

相同程式與 Oracle Client 配置在其他機器沒問題,為何在這台機器會出錯。

面對這種情境,最有效排除問題的做法是逐一比對正常環境與問題環境的大小細節-差異之所在,茶包之所在!

比對程式碼、bin\*.DLL、Oracle Client 版本都一致,依過去的經驗,我想到 PATH 環境變數也影響 ODP.NET 找尋 Oracle Client 的結果,比對正常環境與問題環境設定,發現順序有別:

【問題環境】
Path=D:\oracle\product\11.2R5\client32;D:\oracle\product\11.2R5\client32\bin;D:\oracle\product\12.1.0\client32;D:\oracle\product\12.1.0\client32\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\

【正常環境】 
Path=D:\oracle\product\12.1.0\client32;D:\oracle\product\12.1.0\client32\bin;D:\oracle\product\11.2R5\client32;D:\oracle\product\11.2R5\client32\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\

研判 Oracle 11.2 路徑在前導致 ODP.NET 12.1 找不到 OraOps12.dll,調換 PATH 順序並 IISRESET 仍然無效, 頓時心涼了半截。後來想到 Oracle 許多安裝設定都需要重開機,重開機再試,問題終於消失!

結論

  • Oracle 11.2 與 12.1 Client 並存的環境,PATH 環境變數順序可能影響 ODP.NET 找尋 Unmanaged DLL 的結果。
  • 安裝 Oracle 或修改設定,最好重開機再試較保險。
  • 改用 Managed ODP.NET 能有效減少被 Oracle Client 版本踩雷機率,建議多多利用。(NET 4.0 以上適用,2.0/3.5 哭哭)

Comments

# by noah

感謝分享

Post a comment