在Windows64位環境下.net訪問Oracle解決方案

來源:互聯網
上載者:User

目前,Windows作業系統可以分成兩類,32位和64位(64位也區分x86_64位和 Itanium ),同時Oracle用戶端也做了同樣的區分。

在安裝和開發的過程中,經常會遇到一些問題,本文就總結了相關的解決方案

Oracle Instant Client的

http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html

以下所有的說明都是基於Windows64位的(以Windows2008為例)

1 解決方案(這是最終步驟,其他供參考)

1 安裝Oracle64位用戶端(win64_11gR2_client):

下載頁面:

http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-win64soft-094461.html

http://download.oracle.com/otn/nt/oracle11g/112010/win64_11gR2_client.zip

 

已經下載到\\192.168.9.24\常用軟體\Oracle\win64_11gR2_client.zip

 

然後正常安裝,並進行資料庫連接的配置,比如tnsnames.ora

 

2 將NetWork Service使用者加入Administraotr組中,重啟電腦(重要)

3 建立asp.net網站,配置程式的偵錯模式為使用IIS,不要使用WebServer,這樣就可以調試了

4 由於Webserver是32位的程式,因此如果要使用webserver進行調試,可以考慮安裝32位的Oracle用戶端(沒有進行測試)。

注意:對於已經安裝了32位Oracle用戶端的情況,本次沒有測試

2安裝順序

安裝Oracle 11g Release 2 ODAC 11.2.0.1.2 with Oracle Developer Tools for Visual Studio,設定管理員tnsnames,使用SQLPLUS測試成功串連。

啟動IIS,發布.NET串連ORACLE的應用,測試,報"System.Data.OracleClient 需要Oracle 用戶端軟體8.1.7 或更高版本"錯誤。解決:將ORACLE安裝目錄為Network Service使用者賦讀和執行權,並傳遞到所有子目錄。

重啟動IIS,報“嘗試載入 Oracle 用戶端庫時引發 BadImageFormatException。如果在安裝 32 位 Oracle 用戶端組件的情況下以 64 位元模式運行,將出現此問題。 ”解決:下載並解壓instantclient_11_2的X64版本,放到ORACLE安裝目錄下,並在PATH路徑中搜尋在前。

重啟動IIS,報“ORA-12154: TNS:could not resolve the connect identifier specified”錯誤。解決:指定環境變數TNS_ADMIN到tnsnames.ora所在目錄。

重啟動IIS,.NET應用串連資料庫伺服器成功。

 

3 在asp.net中,不用使用Webdev進行調試,必須使用IIS調試

我們平時使用的都是32位的機器進行開發,裝的都是32位的軟體,但是我們的伺服器一般都是64位的,所以有時也需要在64位的環境下裝一個VS偵錯工具。最近遇到的一個問題就是一個同事換了一個電腦,用的是X64的Windows 2008作為作業系統,要進行Oracle的資料庫連接,所以也裝了64位的Oracle用戶端。如果是控制應用項目或者WinForm項目可以正常串連Oracle,但是Web項目在程式中開啟Oracle串連時,系統拋出了異常:

嘗試載入 Oracle 用戶端庫時引發 BadImageFormatException。如果在安裝 32 位 Oracle 用戶端組件的情況下以 64 位元模式運行,將出現此問題。

顯然,這個提示的不正確,因為我們裝的就是64位的用戶端,所以並不存在64位程式調用32位用戶端的情況。難道是產生的程式是32位的,然後32位調用了64位的用戶端,於是我把程式屬性中的產生平台改為X64,:

結果這樣產生的WebService程式在調用時還是報同樣的異常。這個問題困擾了我一天,其中想到的解決辦法就是把64位的用戶端卸載了,在X64的作業系統中安裝32位的用戶端,然後這樣就可以了,但是如果不是Web應用(比如控制台應用程式或者WinForm程式)卻同樣報錯,那就需要將非Web應用的項目按照的設定方法,將產生的平台改為X86才能正常運行。

解決辦法:

這當然是一個折中的辦法,今天終於發現了真正的原因,原來VS在建Web項目時,平時運行使用的是內建的WebDev.WebServier是一個32位的服務,所以在其中啟動並執行Web項目不管怎麼設定平台,都只能作為32位的應用來看待,所以在Web項目運行時串連64位的Oracle用戶端會報錯,而非Web項目就不會。

網上搜了一下,好像WeDev服務好像沒有64位的,所以要解決這個問題,那麼就不要使用這個服務作為Web服務,而使用IIS,因為IIS使用的是w3wp,在64位的作業系統中是64位的,所以可以正常使用64位的Oracle用戶端。具體設定如下:

 

 

這樣設定後,每次運行就好以IIS來運行,不管是Web項目還是控制台應用項目或者WinForm項目,都會正常串連Oracle了。

 

4 使用VS開發基於Oracle程式的嚴重問題

基於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的開發總結。

 

5 System.Data.OracleClient 需要 Oracle 用戶端軟體 8.1.7 或更高版本

在用VSTS2005/2008+Oracle9做環境串連Oracle時候,在VS 程式開發伺服器運行正常,但IIS伺服器調試和部署會報錯!

      IIS伺服器報錯:System.Data.OracleClient 需要 Oracle 用戶端軟體 8.1.7 或更高版本。

 

出錯的原因:

1.雖然報的是需要安裝用戶端8.1.7及以上版本,實際是.net賬戶沒有訪問Oracle\bin檔案夾的許可權

2.在 Windows Server 2003/2008 的 NTFS系統中提供了進階的訪問安全性,FAT32系統也許沒有這個問題。

 

解決辦法如下:

我用Windows Server 2008 為例 Windows Server 2003 是一樣的

1.開啟安裝有Oracle用戶端的電腦,在安裝目錄 C:\oracle\ora90\BIN 檔案夾上右鍵-》安全選項卡-》點擊  編輯---》添加。

2.點擊“尋找範圍”,在下面顯示的賬戶中選擇“NTWORK SERVICE”  ----將“讀取和執行”的許可權都賦給他(如果不行就把完全控制給他,這樣不安全),子檔案夾繼承此許可權,確定。

3.開啟“伺服器管理員”-》配置-》 本機使用者和組-》組-》adminisgrators-》將Network Service 添加進來

4.重新啟動IIS,在“運行”中輸入“IISRESET”。

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.