基於Oracle開發時遇到
資料連線不成功,請檢查該資料庫是否已啟動嘗試載入oracle用戶端時引發BadImageFormatException.如果在安裝32位Oracle用戶端組件的情況下以64位元模式運行,將出現此問題
The Problem in english is :
"Attempt to load Oracle client libraries threw BadImageFormatException. This problem will occur when running in 64 bit mode with the 32 bit Oracle client components installed"
具體環境是:
win2008 64
vs 2010
開發調試過程中都沒有問題,一部署這個問題就來了。
然後經過一大堆改動,改裝64位Client之後的結果是:
IIS測試都沒有問題,一調試這個問題就來了。
最奇怪的是這兩個錯誤都是同樣的錯誤資訊。
呵呵,兩種情況都 讓我碰到了,那就一起解決了他
我搞了整整兩天才解決,網上有是有相關資料,但是都不全。具體原因也不明了.下面我來全面的講述一下。
追根究底:
請看:
VS編譯器調試過程用的並不是IIS來發布 而是用上面這個進程。我們可以看到,他明顯是一個32位的。而IIS 7的進程w3wp是64 bit的。這就說明,如果我們在調試,那麼我們的程式就在類比32位運行,部署之後,確是類比64位運行,讓我最不能理解的是為什麼一個是類比32位運行,一個是類比64位運行,而給我們的異常資訊確實相同的呢?先不管這麼多,至少現在這裡我們可以得出一個結論:
如果你寫的程式調試過程沒有任何問題,那麼你發布到64位IIS時就一定會有問題,反之則得到相反的結果。
解決方案如下:
情況一.調試過程沒有任何問題,發布時出現問題
若調試沒有任何問題,那麼你肯定是使用32 bit oracle client 了,而伺服器的IIS是64 bit的,所以需要發布網站的話,必須安裝64 bit client
實際上,System.Data.OracleClient所指向的是PATH環境變數下的oci.dll。因此,我們只要讓程式能夠找到64位的oci.dll就可以了。方法如下:
1. 下載instantclient-basic-win-x86-64-11.1.0.7.0.zip,並解壓,如C:\instantclient-basic-win-x86-64-11.1\instantclient_11_1(這個部分也是必須的,根據實際情況的不同進行修改)。
2. 在系統的環境變數PATH中加入以上路徑。
之後重啟作業系統(這個是必須的,我弄了一下午沒有搞好,結果重啟一下馬上就好了),程式會依照PATH路徑尋找oci.dll,如果遇到32位的oci.dll會自動略過,找到64位的oci.dll就能串連上資料庫了。
情況二.調試過程出現問題,但是在IIS上測試沒有問題
若IIS測試沒有任何問題,那麼你肯定使用的是64 bit oracle client 了,調試出錯是因為調試的WebDev進程伺服器是32bit的,為了類比真實環境,你需要進行一些設定。
如果是這樣的情況,那你就改VS的調試伺服器吧,改成IIS就可以了。
到這裡,我們可以下結論,Oracle 給的異常資訊對於第一種情況來說是正確的,對於第二種情況則是錯誤的,意思剛好相反!!!可能是做本地化人員的一個粗心錯誤。
解決完這個問題之後,我的custom oracle membership for sharepoint的測試開發也就搞定了。近期還會記錄一篇文章講述custom oracle membership for sharepoint的開發總結。