ODP.NET 12.1/11.2 並存環境發生找不到 OraOps12.dll 錯誤

是的,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 哭哭)
歡迎推文分享:
Published 13 April 2017 11:17 PM 由 Jeffrey
Filed under:
Views: 1,257



意見

沒有意見

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<April 2017>
SunMonTueWedThuFriSat
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456
 
RSS
創用 CC 授權條款
【廣告】
twMVC

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication