目前,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”。