VS連線不上ORACLE,但oracle客戶端可以連線的問題解決
參考連結:
參考文章一、Linked server和SSIS連線Oracle時的常見問題
1. Linked server去連線oracle的時候,是按照SQL Server 引擎的版本去載入oracle provider的版本。如果SQL Server是64bit的,只能載入64 bit oracle的provider。32bit的SQL Server只能使用32bit的oracle的provider。
2.
很多SQL Server的圖形介面工具都是32bit的,比如SSIS,32位的 import/export
wizard,這些32bit的工具只能load 32 bit
3. Linked server去連線oracle的時候,首先會讀取tnsname.ora檔案,然後讀取sqlnet.ora檔案,然後用SQLServr.exe直接去連oracle,連線成功以後會再次讀取tnsname.ora檔案,然後開始載入oracle OLEDB的DLL檔案。在64位作業系統上安裝的32位SQL Server中,讀到的路徑是這樣的:
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.1.2.118)(PORT=1521))(CONNECT_DATA=(SID=express)(CID=(PROGRAM=D:\Program Files (x86)
在64 bit的作業系統上按照32 bit的SQL Server伺服器以及32 bit的oracle客戶端,是可以建立linked server和SSIS程式包的。但是,oracle在處理包含括號檔案全路徑名稱時有個bug,這個bug在8i,9i和10g的版本上都存在。必須通過打oracle的補丁來解決。
以下報錯由Oracle bug引起(以下參考了官方定義關於此bug的文件):
主題:在64位Windows
原文件 ID: 334528.1
症狀:如果在64位Windows作業系統上執行32位Oracle客戶端,自Windows平臺使用ODBC、OLEDB、OO4O、ODP.NET四種介面之一嘗試聯接Oracle資料庫時,將遇到以下報錯資訊
ORA-12154: TNS:could not resolve the connect identifier specified
或者
ORA-6413: Connection not open. Cause64-bit Microsoft OS's install 32-bit applications into the following location
"C:\Program Files (x86)\..."
rather than the typical location of
"C:\Program Files\..."
這將導致發生現有網路的錯誤,因為網路層無法解析程式地址中包含的可執行檔案是試圖連線到Oracle的路徑括號。
這個bug已被提出來如下修正方案:
更多資訊
之所以遇到ORA-6413或ORA-12154這是一般是取決於您選擇用於連線到Oracle的程式設計介面。
錯誤ORA-12154是當使用最新的OCI介面連線時的典型錯誤,介面包括
Oracle ODBC Driver
Oracle Provider for OLE DB
Oracle Objects for OLE
Oracle Data Provider for .NET (ODP.NET)
Microsoft's .NET Managed Provider for Oracle
錯誤ORA-6413則是使用舊版本的介面,即呼叫Oracle OCI API 7版本的介面:
Microsoft ODBC Driver for Oracle
Microsoft OLE DB Provider for Oracle
解決方案有如下兩種
解決1:
使用Oracle軟體包含Bug 3807408補丁的版本
注意: 目前為止已釋出適用於Windows的補丁有:
Windows 32-bit
9.2.0.7.0 Patch 6: Apply Patch 4928723 or later
10.2.0.1.0 Patch 4: Apply Patch 4923768 or later
10.2.0.2.0 Patch 5: Apply Patch 5383042 or later
10.2.0.3.0: Apply Patch 5337014 or later
Windows 64-bit AMD64 and INTEL EM64T
10.2.0.1.0 Patch 4: Apply Patch 4923787 or later
10.2.0.2.0 Patch 5: Apply Patch 5388871 or later
10.2.0.3.0: Apply Patch 5337014 or later
對於其他版本的Windows平臺請使用解決方案2
解決方案 2:
找到報錯的應用程式路徑,檢查是否含有括號,如何有,請重新配置該應用到一個沒有括號的路徑中
4. 如果使用64 bit的SQL Server伺服器和64 bit 的oracle 客戶端,linked server是可以工作的。但是oracle在64 bit的OLEDB provider上有個bug,會導致連線伺服器訪問失敗。
報錯資訊如:Msg 7333, Level 16, State 2, Line 1
Cannot fetch a row using a bookmark from OLE DB provider "OraOLEDB.Oracle" for
linked server <linked server name>.
這個問題在32位環境下使用32位 MSDAORA (Microsoft’s OLEDB Provider for Oracle) provider或者32-bit ORAOLEDB (Oracle’s OLEDB Provider) provider時不會發生。只發生在使用64-bit ORAOLEDB provider時(MSDAORA沒有64位版本存在)。
這是一個與Oracle的64位OLEDB provider的已知問題。多數情況下,客戶發生錯誤資訊到Oracle或通過Oracle補丁或升級Oracle提供程式解決了這一問題。
最新64位Oracle OLE DB provider版本是10.2.0.3.00. 如果使用者在使用低版本,升級即可解決。
對此問題Oracle正事補丁#5084517,Oracle關於bug1023的前提補丁# 6166400也解決了早期部分使用者的這一問題。看起來這些版本補丁都包含最新的Oracle provider
5. 如果在一個64 位的SQL Server上想同時使用linked server和SSIS的BIDS去連oracle,必須要同時安裝64 位和32位的oracle客戶端。但是,在oracle 10g早期的版本中,貌似有一個bug導致oracle 10g的32 位和64 位客戶端無法同時在一臺機器上工作。不確定這個問題是否已經被解決。目前11g的32bit 和64bit Oracle客戶端同時安裝在一個機器上沒有遇到這樣的問題。
6. 32 位上還可以使用oracle的ODBC driver 建立ODBC資料來源,然後在建立linked server時候使用Microsoft OLEDB for ODBC provider 然後指向oracle的ODBC資料來源。如果是64位的SQL Server 2005,預設安裝是沒有64bit的Microsoft OLEDB for ODBC provider的。需要去下載並安裝64 位 Microsoft OLEDB for ODBC provider,然後就可以按照同樣的方法使用oracle的ODBC。http://www.microsoft.com/downloads/details.aspx?FamilyID=000364db-5e8b-44a8-b9be-ca44d18b059b&displaylang=en
7. 使用oracle ODBC provider比較容易遇到中文字元的問題,建議儘量使用OLEDB的provider。
8. SQL Server對於oracle client OLEDB和ODBC的支援和test只到oracle 8.17的最後版本.這個版本中對於一些資料型別,比如blob欄位是不支援的。如果使用9i以及後續版本的oracle client,不能保證在連線和使用中不遇到任何相容性問題。任何相容性問題,微軟都不保證一定能解決方案。
9. 對於oracle client 9i和10g的版本,Microsoft .net的oracle provider提供了相容性支援。
經歷過疼苦之後就百度、google終於找到了零時的解決辦法,現將詳細操作步驟下下來,供有需要的朋友參考;
具體的解決辦法如下:
1、先將WebDev.WebServer20.EXE和WebDev.WebServer40.EXE檔案從Program Files (x86)目錄中拷貝出來放到c:\dev目錄中
2、開始->執行->cmd , 在命令列視窗輸入: "C:\dev\WebDev.WebServer20.EXE" /port:5970 /path:"D:\WebSite" /vpath:"/"
該命令執行啟動web除錯伺服器
注意上方的path和vpath分別表示:
path:專案檔案所在路徑
vpath:虛擬目錄名稱
port:除錯埠號(可以自行設定)
3、在web專案上 右鍵->屬性,在web選項卡中的“伺服器”中“使用自定web伺服器”,將伺服器url設定為: http://localhost:5970
4、然後在指定頁面中打斷點除錯;
問題分析說明:
主要是因為64位win7系統的Program Files (x86)路徑中的括號引起的,oracle不認識這樣的路徑,所以就出現不能連線資料庫了,但是用plsql和iis伺服器執行程式的時候都是沒有問題的。所以我們就將vs2010的內部除錯web伺服器WebDev.WebServer20.EXE檔案從Program Files (x86)路徑中拷貝出來,放到oracle可以認識的路徑中去,然後在呼叫該伺服器除錯就解決問題了。
最終LZ的解決辦法比較幸運,直接把ORACLE解除安裝了,重灌一遍就好了。