VS连接不上ORACLE,但oracle客户端可以连接的问题解决

来源:互联网 发布:2016黑马python百度云 编辑:程序博客网 时间:2024/05/20 07:15

参考链接:

http://blogs.msdn.com/b/apgcdsd/archive/2011/05/25/linked-server-ssis-oracle.aspx

http://www.cnblogs.com/xiaojinhe2/archive/2013/09/13/3318718.html



参考文章一、Linked server和SSIS连接Oracle时的常见问题


1.Linked server去连接oracle的时候,是按照SQL Server引擎的版本去载入oracle provider的版本。如果SQL Server64bit的,只能载入64 bit oracleprovider32bitSQL Server只能使用32bitoracleprovider

2. 很多SQL Server图形界面工具都是32bit的,比如SSIS32位的 import/export wizard,这些32bit的工具只能load 32 bitoracle provider。如果想知道这个工具是不是32bit的,去检查工具所对应的exe文件是不是在program files(x86)子路径下。

3. Linked server连接oracle的时候,首先会读取tnsname.ora文件,然后读取sqlnet.ora文件,然后用SQLServr.exe直接去连oracle,连接成功以后会再次读取tnsname.ora文件,然后开始载入oracle OLEDBDLL文件。在64位操作系统上安装的32SQL Server中,读到的路径是这样的:

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.1.2.118)(PORT=1521))(CONNECT_DATA=(SID=express)(CID=(PROGRAM=D:\Program Files (x86)\Microsoft SQL Server\MSSQL.1\MSSQL\Binn\sqlservr.exe)(HOST=SCT-IT-SQLTEST)(USER=SYSTEM))))

64 bit的操作系统上按照32 bitSQL Server服务器以及32 bitoracle客户端,是可以创建linked serverSSIS程序包的。但是,oracle在处理包含括号文件全路径名称时有个bug,这个bug8i,9i10g的版本上都存在。必须通过打oracle的补丁来解决。

以下报错由Oracle bug引起(以下参考了官方定义关于此bug的文档):

主题:64Windows操作系统上运行32Oracle报错ORA-12154或者 ORA-6413

原文档 ID: 334528.1

症状:如果在64Windows操作系统上运行32Oracle客户端,自Windows平台使用ODBCOLEDBOO4OODP.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已被提出来如下修正方案:

Bug 3807408 - CANNOT EXTERNALLY AUTHENTICATE USER WITH QUOTE IN USERNAME

更多信息

之所以遇到ORA-6413ORA-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 bitSQL Server服务器和64 bitoracle 客户端,linked server是可以工作的。但是oracle64 bitOLEDB 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位版本存在)。

这是一个与Oracle64OLEDB provider的已知问题。多数情况下,客户发生错误信息到Oracle或通过Oracle补丁或升级Oracle提供程序解决了这一问题。

最新64Oracle OLE DB provider版本是10.2.0.3.00.如果用户在使用低版本,升级即可解决。

对此问题Oracle正事补丁#5084517Oracle关于bug1023的前提补丁# 6166400也解决了早期部分用户的这一问题。看起来这些版本补丁都包含最新的Oracle provider

5. 如果在一个64位的SQL Server上想同时使用linked serverSSISBIDS去连oracle,必须要同时安装64位和32位的oracle客户端。但是,在oracle 10g早期的版本中,貌似有一个bug导致oracle 10g32 位和64位客户端无法同时在一台机器上工作。不确定这个问题是否已经被解决。目前11g32bit64bit Oracle客户端同时安装在一个机器上没有遇到这样的问题。

6. 32位上还可以使用oracleODBC driver创建ODBC数据源,然后在创建linked server时候使用Microsoft OLEDB for ODBC provider然后指向oracleODBC数据源。如果是64位的SQL Server 2005,默认安装是没有64bitMicrosoft OLEDB for ODBC provider的。需要去下载并安装64 Microsoft OLEDB for ODBC provider,然后就可以按照同样的方法使用oracleODBChttp://www.microsoft.com/downloads/details.aspx?FamilyID=000364db-5e8b-44a8-b9be-ca44d18b059b&displaylang=en

7. 使用oracle ODBC provider比较容易遇到中文字符的问题,建议尽量使用OLEDBprovider

8. SQL Server对于oracle client OLEDBODBC的支持和test只到oracle 8.17的最后版本.这个版本中对于一些数据类型,比如blob字段是不支持的。如果使用9i以及后续版本的oracle client,不能保证在连接和使用中不遇到任何兼容性问题。任何兼容性问题,微软都不保证一定能解决方案。

9. 对于oracle client 9i10g的版本,Microsoft .netoracle provider提供了兼容性支持。



参考文章二、64位Win7系统下vs2010调试无法连接oracle解决办法


经历过疼苦之后就百度、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卸载了,重装一遍就好了。


0 0