1. 程式人生 > >在Windows64位環境下.net訪問Oracle解決方案

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

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

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

Oracle Instant Client的下載地址

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

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

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

下載頁面:

下載地址:

已經下載到\\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了。


基於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”。

相關推薦

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

目前,Windows作業系統可以分成兩類,32位和64位(64位也區分x86_64位和 Itanium ),同時Oracle客戶端也做了同樣的區分。 在安裝和開發的過程中,經常會遇到一些問題,本文就總結了相關的解決方案 Oracle Instant Client的下載地址

Redis學習筆記(一)關於在windows64環境的安裝學習使用

客戶端 mas key-value 錯誤 services 再次 基準 alt 類型 前言 由於工作需要,目前我正在學習使用Redis。我當時學習Redis就從網上下載了點資料就開始學習了。入門看的是《REDIS入門指南》,這本書個人覺得很適合新手用來學習接觸。根據書上的引

windows64環境python安裝numpy、scipy和matplotlib

最近想使用python做一些機器學習方向的演算法實現,使用python做資料分析和矩陣運算什麼的常需要三個庫檔案:numpy、scipy和matplotlib,於是著手安裝。 我自己機子的配置是win8+64位作業系統,python安裝的版本是3.4.1。安裝這幾個庫首先

物聯網環境裝置運維解決方案分析

簡要的分析下在物聯網環境下裝置運維方向解決方案的開發。 1. 需求 物聯網環境下,物端,也就是裝置有兩個基本特徵,一個就是數量特別的大,另外一個就是非本地管理。 數量大,分佈廣 這個有很多的報告都給出了類似的預測。 非本地管理 本地管理的最典型的例子就是PC機,例

Java多執行緒環境的懶漢模式解決方案

一、場景簡述 單例模式下有餓漢模式和懶漢模式,其中懶漢模式在於呼叫相關方法時例項才被建立。懶漢模式我們不難實現,但是在懶漢模式下我們如果使用多執行緒,就會取出多個例項的情況,與單例模式相違背,所以該篇部落格筆者主要關於在多執行緒環境下利用DCL雙檢查鎖機制來實現懶漢模式。

MongoDB分片環境整體資料遷移解決方案

背景:這周請了幾天假,25號早上來了,就開始搞MongoDB資料庫分片叢集環境的整體遷移,起初以為很容易,但是在遷移的過程中,遇到了各種問題。還好經過兩天的研究,現在終於搞定!匆忙之中,整理了一下文件,由於網上關於MongoDB資料庫遷移的文章較少,顧發表

web叢集環境session問題得解決方案比較

叢集中session安全和同步是個最大的問題,下面是我收集到的幾種session同步的方案,希望能通過分析其各自的優劣找出其適應的場景。 1. 客戶端cookie加密 這是我以前採用的方式,簡單,高效。比較好的方法是自己採用cookie機制來實現一個session,在

解決華為AR100W-S路由器回流問題(內網環境無法訪問自己的外網地址)

ani blog ges size ces 默認 手動 服務器 lan 1、 登入後切換到高級模式 2、設置好了專線IP後默認會有一個外網訪問接口GE0/0/4,手動再添加一個內網訪問接口,Vlanif1為內網接口名 3、配置內部服務器1)新建一個外網接口,GE0/0/4

解決apache環境網站訪問速度慢的問題(重點參考)

如果apche訪問量過大,將會導致頁面開啟遲緩,下載速度也降低,如果由於經費和環境問題,叢集方案沒有得以應用。可以通過對Apache2增加模組MPM來進行優化, 這裡我選擇執行緒型MPM加以優化:  開啟mpm:在httpd.conf檔案中去掉 Include conf/e

.net訪問Oracle數據庫

manage bsp except mat client data oracl 訪問 nbsp 使用System.Data.OracleClient訪問Oracle數據庫時報錯 嘗試加載 Oracle 客戶端庫時引發 BadImageFormatException。如果在

idea ssm專案出現日誌中文亂碼,封裝的json中的msg欄中文亂碼(但是json封裝的bean中的欄不亂碼)等其他各種專案的中文亂碼解決方案

   開頭劃重點!(敲黑板):rebuild和mvn package的迴圈往復好幾次的操作是解決這個問題的最主要的方法! 經過多次試驗,發現這樣做就可以正常顯示中文了 我說為什麼有時候亂碼,有時候中文正常,原來下面的這些地方都必須設定好,特別是 rebuild和m

Win7 64環境JDK和Eclipse的選擇與安裝

現在無論筆記本還是桌上型電腦的記憶體都已經是白菜價,4G以上的記憶體配置隨處可見。我最近也將筆記本的記憶體升至8G,自然想更好的支援大容量記憶體,安裝64系統成了必要的選擇。就個人的使用情況來看,基本沒發現什麼常用軟體對64位win7有不相容的情

Java JNI Windows64系統 使用32的dll

今天遇到在處理一個多classloader呼叫本地native方法報錯的問題的時候,想要通過呼叫本地的一個dll進行測試。該dll是在32位環境下編譯的。而OneCoder的除錯機器是64位的win7。自然呼叫會報如下錯誤: Can

c# 對oracle插入資料欄過長超出限制的解決方案

通過建立儲存過程的方法解決問題,如下所示,儲存過程的名字為insertGEO,有4個輸入引數,Childrens,RingInParent直接通過sql語句插入時,欄位值過長會報錯,所以先在資料庫中建立儲存過程 create or replace procedure insertGEO (v_i

(三) Hyperledger Fabric 在 Ubuntu16.04 64環境手動啟動Fabric網路

一、 前期準備項 版本 更新或下載URL Ubuntu 16.04 64位 略 依賴項(不分先後順序) docker 17.05.0-ce yes|cp -f ./docker.repo /etc/yum.repos.d/docker.repo sudo

把war包放到Tomcat安裝目錄,不能直接訪問解決方案

臨床表現: 將自己寫的一個web工程war包放到Tomcat安裝目錄下的/webapps下面(比如helloworld.war),通過瀏覽器訪問http://localhost:8080/helloworld,卻無法訪問。 訪問時出現404錯誤,The r

Win7 64環境python3.5.4安裝步驟

  一.初始環境介紹 然後從官網:python官網下載windows對應的python版本, 二.安裝流程 1.將python-3.5.4-amd64.exe抓到本地後,右鍵選擇”以管理員身份執行”,這一步是必須的,不然後面安裝時會報執行錯誤.  2. 執行安裝包

linux環境mysql大小寫敏感解決辦法

原文地址:http://www.2cto.com/database/201503/386261.html 1、Linux下mysql安裝完後是預設:區分表名的大小寫,不區分列名的大小寫; 2、用root帳號登入後,在/etc/my.cnf中的[mysqld]後新增新

mac os環境安裝lightgbm失敗 解決方法

問題 使用官方github的安裝方法,在cmake地方編譯不通過 解決 已安裝過Cmake,保證cmake版本要3.8以上,通用–更新cmake版本 gcc版本有問題,原mac os 因為其他專案下載過gcc-6 使用gcc-6 編譯lighgb

關於ASP.NET MVC WebApi介面跨域訪問解決方案

1.跨域問題的由來同源策略:處於安全考慮,瀏覽器會限制指令碼中發起的跨站請求,瀏覽器要求JavaScript或Cookie只能訪問同域下的內容正是由於這個原因,我們不同的專案之間的呼叫就會被瀏覽器阻止。比如我們常見的場景:WebApi作為資料服務層,它是一個單獨的專案,我們的