在Windows64位环境下.net访问Oracle解决方案(转)
目前,Windows操作系統(tǒng)可以分成兩類,32位和64位(64位也區(qū)分x86_64位和 Itanium ),同時(shí)Oracle客戶端也做了同樣的區(qū)分。
在安裝和開發(fā)的過程中,經(jīng)常會(huì)遇到一些問題,本文就總結(jié)了相關(guān)的解決方案
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
已經(jīng)下載到\\192.168.9.24\常用軟件\Oracle\win64_11gR2_client.zip
然后正常安裝,并進(jìn)行數(shù)據(jù)庫連接的配置,比如tnsnames.ora
2 將NetWork Service用戶加入Administraotr組中,重啟計(jì)算機(jī)(重要)
3 新建asp.net網(wǎng)站,配置程序的調(diào)試模式為使用IIS,不要使用WebServer,這樣就可以調(diào)試了
4 由于Webserver是32位的程序,因此如果要使用webserver進(jìn)行調(diào)試,可以考慮安裝32位的Oracle客戶端(沒有進(jìn)行測試)。
注意:對于已經(jīng)安裝了32位Oracle客戶端的情況,本次沒有測試
2安裝順序
http://wangyj.blog.163.com/blog/static/85232558201081971322105/
安裝Oracle 11g Release 2 ODAC 11.2.0.1.2 with Oracle Developer Tools for Visual Studio,配置服務(wù)器tnsnames,使用SQLPLUS測試成功連接。
啟動(dòng)IIS,發(fā)布.NET連接ORACLE的應(yīng)用,測試,報(bào)"System.Data.OracleClient 需要Oracle 客戶端軟件8.1.7 或更高版本"錯(cuò)誤。解決:將ORACLE安裝目錄為Network Service用戶賦讀和執(zhí)行權(quán),并傳遞到所有子目錄。
重啟動(dòng)IIS,報(bào)“嘗試加載 Oracle 客戶端庫時(shí)引發(fā) BadImageFormatException。如果在安裝 32 位 Oracle 客戶端組件的情況下以 64 位模式運(yùn)行,將出現(xiàn)此問題。 ”解決:下載并解壓instantclient_11_2的X64版本,放到ORACLE安裝目錄下,并在PATH路徑中搜索在前。
重啟動(dòng)IIS,報(bào)“ORA-12154: TNS:could not resolve the connect identifier specified”錯(cuò)誤。解決:指定環(huán)境變量TNS_ADMIN到tnsnames.ora所在目錄。
重啟動(dòng)IIS,.NET應(yīng)用連接數(shù)據(jù)庫服務(wù)器成功。
3 在asp.net中,不用使用Webdev進(jìn)行調(diào)試,必須使用IIS調(diào)試
http://www.cnblogs.com/studyzy/archive/2010/10/28/1863056.html
我們平時(shí)使用的都是32位的機(jī)器進(jìn)行開發(fā),裝的都是32位的軟件,但是我們的服務(wù)器一般都是64位的,所以有時(shí)也需要在64位的環(huán)境下裝一個(gè)VS調(diào)試程序。最近遇到的一個(gè)問題就是一個(gè)同事?lián)Q了一個(gè)電腦,用的是X64的Windows 2008作為操作系統(tǒng),要進(jìn)行Oracle的數(shù)據(jù)庫連接,所以也裝了64位的Oracle客戶端。如果是控制應(yīng)用項(xiàng)目或者WinForm項(xiàng)目可以正常連接Oracle,但是Web項(xiàng)目在程序中打開Oracle連接時(shí),系統(tǒng)拋出了異常:
嘗試加載 Oracle 客戶端庫時(shí)引發(fā) BadImageFormatException。如果在安裝 32 位 Oracle 客戶端組件的情況下以 64 位模式運(yùn)行,將出現(xiàn)此問題。
顯然,這個(gè)提示的不正確,因?yàn)槲覀冄b的就是64位的客戶端,所以并不存在64位程序調(diào)用32位客戶端的情況。難道是生成的程序是32位的,然后32位調(diào)用了64位的客戶端,于是我把程序?qū)傩灾械纳善脚_(tái)改為X64,如圖所示:
結(jié)果這樣生成的WebService程序在調(diào)用時(shí)還是報(bào)同樣的異常。這個(gè)問題困擾了我一天,其中想到的解決辦法就是把64位的客戶端卸載了,在X64的操作系統(tǒng)中安裝32位的客戶端,然后這樣就可以了,但是如果不是Web應(yīng)用(比如控制臺(tái)應(yīng)用程序或者WinForm程序)卻同樣報(bào)錯(cuò),那就需要將非Web應(yīng)用的項(xiàng)目按照上圖的設(shè)置方法,將生成的平臺(tái)改為X86才能正常運(yùn)行。
解決辦法:
這當(dāng)然是一個(gè)折中的辦法,今天終于發(fā)現(xiàn)了真正的原因,原來VS在建Web項(xiàng)目時(shí),平時(shí)運(yùn)行使用的是自帶的WebDev.WebServier是一個(gè)32位的服務(wù),所以在其中運(yùn)行的Web項(xiàng)目不管怎么設(shè)置平臺(tái),都只能作為32位的應(yīng)用來看待,所以在Web項(xiàng)目運(yùn)行時(shí)連接64位的Oracle客戶端會(huì)報(bào)錯(cuò),而非Web項(xiàng)目就不會(huì)。
網(wǎng)上搜了一下,好像WeDev服務(wù)好像沒有64位的,所以要解決這個(gè)問題,那么就不要使用這個(gè)服務(wù)作為Web服務(wù),而使用IIS,因?yàn)镮IS使用的是w3wp,在64位的操作系統(tǒng)中是64位的,所以可以正常使用64位的Oracle客戶端。具體設(shè)置如下:
這樣設(shè)置后,每次運(yùn)行就好以IIS來運(yùn)行,不管是Web項(xiàng)目還是控制臺(tái)應(yīng)用項(xiàng)目或者WinForm項(xiàng)目,都會(huì)正常連接Oracle了。
4 使用VS開發(fā)基于Oracle程序的嚴(yán)重問題
基于Oracle開發(fā)時(shí)遇到
???? 數(shù)據(jù)連接不成功,請檢查該數(shù)據(jù)庫是否已啟動(dòng)嘗試加載oracle客戶端時(shí)引發(fā)BadImageFormatException.如果在安裝32位Oracle客戶端組件的情況下以64位模式運(yùn)行,將出現(xiàn)此問題
? 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"??
??? 具體環(huán)境是:
????? win2008? 64
????? vs 2010
??????? 開發(fā)調(diào)試過程中都沒有問題,一部署這個(gè)問題就來了。
?????? 然后經(jīng)過一大堆改動(dòng),改裝64位Client之后的結(jié)果是:
??????? IIS測試都沒有問題,一調(diào)試這個(gè)問題就來了。
?????? 最奇怪的是這兩個(gè)錯(cuò)誤都是同樣的錯(cuò)誤信息。
?????? 呵呵,兩種情況都 讓我碰到了,那就一起解決了他???????????
????? 我搞了整整兩天才解決,網(wǎng)上有是有相關(guān)資料,但是都不全。具體原因也不明了.下面我來全面的講述一下。
追根究底:???
請看下圖:????????
VS編譯器調(diào)試過程用的并不是IIS來發(fā)布?? 而是用上面這個(gè)進(jìn)程。我們可以看到,他明顯是一個(gè)32位的。而IIS 7的進(jìn)程w3wp是64 bit的。這就說明,如果我們在調(diào)試,那么我們的程序就在模擬32位運(yùn)行,部署之后,確是模擬64位運(yùn)行,讓我最不能理解的是為什么一個(gè)是模擬32位運(yùn)行,一個(gè)是模擬64位運(yùn)行,而給我們的異常信息確實(shí)相同的呢?先不管這么多,至少現(xiàn)在這里我們可以得出一個(gè)結(jié)論:
如果你寫的程序調(diào)試過程沒有任何問題,那么你發(fā)布到64位IIS時(shí)就一定會(huì)有問題,反之則得到相反的結(jié)果。????????????????????
解決方法如下:
情況一.調(diào)試過程沒有任何問題,發(fā)布時(shí)出現(xiàn)問題
???????? 若調(diào)試沒有任何問題,那么你肯定是使用32 bit oracle client 了,而服務(wù)器的IIS是64 bit的,所以需要發(fā)布網(wǎng)站的話,必須安裝64 bit client
實(shí)際上,System.Data.OracleClient所指向的是PATH環(huán)境變量下的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(這個(gè)部分也是必須的,根據(jù)實(shí)際情況的不同進(jìn)行修改)。
2. 在系統(tǒng)的環(huán)境變量PATH中加入以上路徑。
之后重啟操作系統(tǒng)(這個(gè)是必須的,我弄了一下午沒有搞好,結(jié)果重啟一下馬上就好了),程序會(huì)依照PATH路徑尋找oci.dll,如果遇到32位的oci.dll會(huì)自動(dòng)略過,找到64位的oci.dll就能連接上數(shù)據(jù)庫了。
情況二.調(diào)試過程出現(xiàn)問題,但是在IIS上測試沒有問題
?????????? 若IIS測試沒有任何問題,那么你肯定使用的是64 bit oracle client 了,調(diào)試出錯(cuò)是因?yàn)檎{(diào)試的WebDev進(jìn)程服務(wù)器是32bit的,為了模擬真實(shí)環(huán)境,你需要進(jìn)行一些設(shè)置。
如果是這樣的情況,那你就改VS的調(diào)試服務(wù)器吧,改成IIS就可以了。
?????? 到這里,我們可以下結(jié)論,Oracle 給的異常信息對于第一種情況來說是正確的,對于第二種情況則是錯(cuò)誤的,意思剛好相反!!!可能是做本地化人員的一個(gè)粗心錯(cuò)誤。
????? 解決完這個(gè)問題之后,我的custom oracle? membership? for sharepoint的測試開發(fā)也就搞定了。近期還會(huì)記錄一篇文章講述custom oracle? membership? for sharepoint的開發(fā)總結(jié)。
5 System.Data.OracleClient 需要 Oracle 客戶端軟件 8.1.7 或更高版本
http://www.cnblogs.com/TerryFeng/archive/2009/02/23/1396625.html
在用VSTS2005/2008+Oracle9做環(huán)境連接Oracle時(shí)候,在VS 開發(fā)服務(wù)器運(yùn)行正常,但I(xiàn)IS服務(wù)器調(diào)試和部署會(huì)報(bào)錯(cuò)!
????? IIS服務(wù)器報(bào)錯(cuò):System.Data.OracleClient 需要 Oracle 客戶端軟件 8.1.7 或更高版本。
出錯(cuò)的原因:
1.雖然報(bào)的是需要安裝客戶端8.1.7及以上版本,實(shí)際是.net賬戶沒有訪問Oracle\bin文件夾的權(quán)限
2.在 Windows Server 2003/2008 的 NTFS系統(tǒng)中提供了高級的訪問安全性,FAT32系統(tǒng)也許沒有這個(gè)問題。
解決辦法如下:
我用Windows Server 2008 為例 Windows Server 2003 是一樣的
1.打開安裝有Oracle客戶端的電腦,在安裝目錄 C:\oracle\ora90\BIN 文件夾上右鍵-》安全選項(xiàng)卡-》點(diǎn)擊? 編輯---》添加。
2.點(diǎn)擊“查找范圍”,在下面顯示的賬戶中選擇“NTWORK SERVICE”? ----將“讀取和執(zhí)行”的權(quán)限都賦給他(如果不行就把完全控制給他,這樣不安全),子文件夾繼承此權(quán)限,確定。
3.打開“服務(wù)器管理器”-》配置-》 本地用戶和組-》組-》adminisgrators-》將Network Service 添加進(jìn)來
4.重新啟動(dòng)IIS,在“運(yùn)行”中輸入“IISRESET”。
?
轉(zhuǎn)載于http://blog.csdn.net/zouyujie1127/article/details/6371165
轉(zhuǎn)載于:https://www.cnblogs.com/gisflyer/archive/2011/11/05/2237200.html
總結(jié)
以上是生活随笔為你收集整理的在Windows64位环境下.net访问Oracle解决方案(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Craftor原创]EZ-USB与FP
- 下一篇: error C1189: #error