使用VS開發基於Oracle程式的嚴重問題32位64位
基於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的開發總結。