1. 程式人生 > >使用VS開發基於Oracle程式的嚴重問題32位64位

使用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的開發總結。