当前位置:  开发笔记 > 编程语言 > 正文

提供程序与Oracle客户端版本不兼容

如何解决《提供程序与Oracle客户端版本不兼容》经验,为你挑选了8个好方法。

我正在尝试在我的ASP.net项目上使用Oracle ODP.NET 11g(11.1.0.6.20)Instant Client作为数据提供程序,但是当我运行aspx页面时,我得到一个" 提供程序与版本不兼容"Oracle客户端 "错误消息.任何帮助,将不胜感激.

我在Visual Studio 2005中引用了数据提供程序,后面的代码如下所示:

using Oracle.DataAccess.Client;
..

OracleConnection oOracleConn = new OracleConnection();
oOracleConn.ConnectionString =
    "Data Source=MyOracleServerName;" +
    "Integrated Security=SSPI";
oOracleConn.Open();

//Do Something

oOracleConn.Close();

页面的错误如下所示:

Exception Details: Oracle.DataAccess.Client.OracleException: The provider is not compatible with the version of Oracle client

Source Error: 
Line 21: 
Line 22: 
Line 23:             OracleConnection oOracleConn = new OracleConnection();
Line 24:             oOracleConn.ConnectionString =
Line 25:                 "Data Source=MyOracleServerName;" +

[OracleException (0x80004005): The provider is not compatible with the version of Oracle client]
   Oracle.DataAccess.Client.OracleInit.Initialize() +494
   Oracle.DataAccess.Client.OracleConnection..cctor() +483

Stack Trace: 
[TypeInitializationException: The type initializer for 'Oracle.DataAccess.Client.OracleConnection' threw an exception.]
   Oracle.DataAccess.Client.OracleConnection..ctor() +0
   Boeing.IVX.Web.RoyTesting.Page_Load(Object sender, EventArgs e) in C:\Documents and Settings\CE218C\Desktop\IVX.Net\Web\IVX\RoyTesting.aspx.cs:23
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +33
   System.Web.UI.Control.OnLoad(EventArgs e) +99
   System.Web.UI.Control.LoadRecursive() +47
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1436

Chris.. 90

我一直在研究这个问题,你只需要从相同的下载版本的ODP.Net中获取所有相应的DLL,并将它们放在与Exe文件相同的文件夹中,因为ODP.Net对于不混合而言非常挑剔版本号.

我在这里解释了如何做到这一点:http://splinter.com.au/using-the-new-odpnet-to-access-oracle-from-c 以下是它的要点:

下载ODP.Net

解压缩文件

解压缩其中的所有JAR

抓住刚刚解压缩的这些dll:

oci.dll(从'oci.dll.dbl'重命名)

Oracle.DataAccess.dll

oraociicus11.dll

OraOps11w.dll

orannzsbb11.dll

oraocci11.dll

ociw32.dll(从'ociw32.dll.dbl'重命名)

将所有DLL放在与C#Executable相同的文件夹中

另外,我在我的开发机器上使用了最新版本的ODAC(11.2.0.1.2),我需要的唯一文件是:oci.dll,Oracle.DataAccess.dll,oraociei11.dll,OraOps11w.dll.正如克里斯指出的那样,请确保他们在同一个文件夹中作为您的可执行文件.;-) (10认同)

您的解决方案对我有用 - 在我找到之前找到了您的博客文章.你就是男人.谢谢!:-)另外,使用最新版本的ODAC,我不需要解压缩任何JAR ... .dll文件位于我的oracle主目录中的各个目录中.一个简单的Windows搜索非常快速地启动了它们. (4认同)


Tod Thomson.. 45

您应该为启动器"忽略"所有x86/x64对话,而是尝试使用ODP.NET托管驱动程序(如果您使用的是.Net v4 +):

https://www.nuget.org/packages/Oracle.ManagedDataAccess/

https://www.nuget.org/packages/Oracle.ManagedDataAccess.EntityFramework/

Oracle ODP.net托管与非托管驱动程序

避免所有"非托管"DLL什么架构问题!:D(约时间Oracle).

NuGet包(也适用于11g):

在此输入图像描述

旧/手动方法:

有关如何转换为使用托管库的信息:

首先,这是托管非托管的良好代码比较:http://docs.oracle.com/cd/E51173_01/win.122/e17732/intro005.htm#ODPNT148

确保您仅下载了ODP.NET,托管驱动程序Xcopy版本

从下载的zip文件中,复制并粘贴到项目目录中:

Oracle.ManagedDataAccessDTC.dll

Oracle.ManagedDataAccess.dll

添加对Oracle.ManagedDataAccess.dll的引用

确保您的exe已发布(添加到VS2010中的应用程序文件夹)与两个dll

大家都知道,虽然托管服务提供商很好,但它缺乏完整提供商允许的许多功能.即,Oracle内置加密功能. (5认同)

好消息是Oracle最终拥有一个完全托管的驱动程序.拖着100mb dll是一个真正的负担. (3认同)

最后.这个完全超过了我,谢谢. (3认同)

使用托管驱动程序是最终的解决方案!每当我认为我遇到类型不匹配的所有时间时,我都会感到非常沮丧 (2认同)


EverTheLearn.. 35

我只安装了用于.NET 2.0Oracle数据提供程序(11.1.0.6.20),但我没有安装Oracle Instant Client(11.1.0.6.0).

我刚安装它,错误消失了!



1> Chris..:

我一直在研究这个问题,你只需要从相同的下载版本的ODP.Net中获取所有相应的DLL,并将它们放在与Exe文件相同的文件夹中,因为ODP.Net对于不混合而言非常挑剔版本号.

我在这里解释了如何做到这一点:http://splinter.com.au/using-the-new-odpnet-to-access-oracle-from-c 以下是它的要点:

下载ODP.Net

解压缩文件

解压缩其中的所有JAR

抓住刚刚解压缩的这些dll:

oci.dll(从'oci.dll.dbl'重命名)

Oracle.DataAccess.dll

oraociicus11.dll

OraOps11w.dll

orannzsbb11.dll

oraocci11.dll

ociw32.dll(从'ociw32.dll.dbl'重命名)

将所有DLL放在与C#Executable相同的文件夹中


另外,我在我的开发机器上使用了最新版本的ODAC(11.2.0.1.2),我需要的唯一文件是:oci.dll,Oracle.DataAccess.dll,oraociei11.dll,OraOps11w.dll.正如克里斯指出的那样,请确保他们在同一个文件夹中作为您的可执行文件.;-)
您的解决方案对我有用 - 在我找到之前找到了您的博客文章.你就是男人.谢谢!:-)另外,使用最新版本的ODAC,我不需要解压缩任何JAR ... .dll文件位于我的oracle主目录中的各个目录中.一个简单的Windows搜索非常快速地启动了它们.

2> Tod Thomson..:

您应该为启动器"忽略"所有x86/x64对话,而是尝试使用ODP.NET托管驱动程序(如果您使用的是.Net v4 +):

https://www.nuget.org/packages/Oracle.ManagedDataAccess/

https://www.nuget.org/packages/Oracle.ManagedDataAccess.EntityFramework/

Oracle ODP.net托管与非托管驱动程序

避免所有"非托管"DLL什么架构问题!:D(约时间Oracle).

NuGet包(也适用于11g):

在此输入图像描述

旧/手动方法:

有关如何转换为使用托管库的信息:

首先,这是托管非托管的良好代码比较:http://docs.oracle.com/cd/E51173_01/win.122/e17732/intro005.htm#ODPNT148

确保您仅下载了ODP.NET,托管驱动程序Xcopy版本

从下载的zip文件中,复制并粘贴到项目目录中:

Oracle.ManagedDataAccessDTC.dll

Oracle.ManagedDataAccess.dll

添加对Oracle.ManagedDataAccess.dll的引用

确保您的exe已发布(添加到VS2010中的应用程序文件夹)与两个dll


大家都知道,虽然托管服务提供商很好,但它缺乏完整提供商允许的许多功能.即,Oracle内置加密功能.
好消息是Oracle最终拥有一个完全托管的驱动程序.拖着100mb dll是一个真正的负担.
最后.这个完全超过了我,谢谢.
使用托管驱动程序是最终的解决方案!每当我认为我遇到类型不匹配的所有时间时,我都会感到非常沮丧

3> EverTheLearn..:

我只安装了用于.NET 2.0Oracle数据提供程序(11.1.0.6.20),但我没有安装Oracle Instant Client(11.1.0.6.0).

我刚安装它,错误消失了!


你能简单地将4个即时客户端DLL复制到与EXE相同的文件夹中,而不是安装客户端吗?(这些文件:oci.dll orannzsbb11.dll oraocci11.dll oraociicus11.dll)
@Chris:是的,你可以.根据我的经验,你需要oci.dll,orannzsbb11.dll,oraociicus11.dll,oraops11w.dll和oracle.dataaccess.dll

4> Daniel..:

这可能是由针对32位Oracle客户端运行64位.NET运行时引起的.如果您的服务器在64位上运行应用程序,则会发生这种情况.它将运行64位运行时的.NET应用程序.您可以在VS中的项目上设置CPU标志,以便在32位运行时中运行.



5> Wernfried Do..:

让我们做一些总结:

错误消息"提供程序与Oracle客户端版本不兼容"可能由多种原因引起.

您没有安装Oracle客户端.在这种情况下,错误消息确实具有误导性.

Oracle Data Oracle.DataAccess.dllClient for .NET(ODP.NET,即文件)不包含在Oracle Instant Client中,必须单独安装(从32位Oracle数据访问组件(ODAC)或64位Oracle数据访问组件下载( ODAC)下载)或您必须在Oracle Universal Installer(OUI)中选择相应的选项.

请注意,在安装Oracle Data Provider> = 12.2时,提供程序不会自动注册到GAC中.如果需要,您必须手动注册,请参阅Oracle Doc 2272241.1.

ODP.NET的版本与安装的Oracle客户端版本不匹配.你必须检查次要版本号!例如,Oracle.DataAccess.dll版本4.112.3.0与Oracle Client 11.2.0.4不兼容.仔细检查ODP.NET和Oracle Client的版本.您可以使用sigcheck上oraociei*.dll和/或OraOps*w.dll获得Oracle客户端的版本.

注意不同的编号方案.文件版本4.112.3.0表示:.NET Framework 4版中,Oracle发布11.2.0.3.x.

有ODP.NET版本"1.x","2.x"和"4.x".这些数字与Microsoft .NET Framework版本1.0.3705/1.1.4322,2.0.50727和4.0.30319相关.版本"1.x"在Oracle Client 11.1之前可用.Oracle Client 11.2引入了版本"4.x"

ODP.NET的体系结构(32位或64位)与您的应用程序体系结构不匹配.32位应用程序仅适用于32位Oracle Client/ODP.NET,64位应用程序需要64位Oracle Client/ODP.NET.(除非您使用ODP.NET托管驱动程序)

.NET Framework版本不匹配.例如,如果使用Target .NET Framework 2.0编译应用程序,则无法使用ODP.NET版本4.x. .NET Framework目标版本必须等于或高于ODP.NET的版本.

的版本Oracle.DataAccess.dll在开发机器上(即这是在编译时加载的版本)比目标机上的版本更高.

请注意,Oracle.DataAccess.dll可能会从GAC加载,默认情况下,GAC优先于任何本地提供的文件.

解决方案

考虑使用ODP.NET托管驱动程序,它可以从Oracle页面下载:64位Oracle数据访问组件(ODAC)下载.在那里你只需要将Oracle.ManagedDataAccess.dll文件复制到你的应用程序目录,不需要其他任何东西.它适用于32位和64位.

在你的*.csproj,相应的.*.vbproj编辑您对ODP.NET的引用,如下所示:


  False
  False

属性喜欢Version=...processorArchitecture=...不是必需的.您的应用程序将加载正确的,Oracle.DataAccess.dll具体取决于所选的体系结构和目标.NET框架(前提是它已正确安装) - >未经100%验证

如果您不知道目标计算机上的Oracle客户端版本(例如,它可能是您客户的计算机):转到上面提到的下载页面并下载最少的XCopy版本的Oracle数据访问组件.解压缩zip并将文件仅复制Oracle.DataAccess.dll到本地计算机.在你的VS项目中引用这个(很可能是过时的)DLL.此DLL的版本是您的应用程序将使用的最低版本的ODP.NET.运行应用程序时,GAC中的发布者策略将重定向到实际安装的版本.

我不认为采用单个DLL并将它们复制到某些文件夹是一种聪明的方法.它可以在"裸机"上运行,但如果您的目标机器安装了任何Oracle产品,则版本不匹配的风险很高.从您的计算机上卸载所有Oracle产品并进行全新安装.看看如何卸载/完全删除Oracle 11g(客户端)?它命令得到一个非常干净的机器.

如果您必须同时使用32位和64位应用程序,请按照此说明在一台计算机上安装两个版本:

假设:调用Oracle Home OraClient11g_home1,客户端版本为11gR2.

(可选)删除已安装的任

例如,下载并安装Oracle x86客户端 C:\Oracle\11.2\Client_x86

将Oracle x64 Client下载并安装到不同的文件夹中,例如 C:\Oracle\11.2\Client_x64

打开命令行工具,转到文件夹%WINDIR%\ System32,通常C:\Windows\System32创建一个指向ora112文件夹的符号链接C:\Oracle\11.2\Client_x64(见下文)

通常更改为文件夹%WINDIR%\ SysWOW64 C:\Windows\SysWOW64并创建指向ora112文件夹的符号链接C:\Oracle\11.2\Client_x86(参见下文)

修改PATH环境变量,更换喜欢的所有条目C:\Oracle\11.2\Client_x86,并C:\Oracle\11.2\Client_x64通过C:\Windows\System32\ora112,相应的其\bin子文件夹.注意:C:\Windows\SysWOW64\ora112不得在PATH环境中.

如果需要,将yor ORACLE_HOME环境变量设置为C:\Windows\System32\ora112

打开注册表编辑器.将注册表值设置HKLM\Software\ORACLE\KEY_OraClient11g_home1\ORACLE_HOMEC:\Windows\System32\ora112

将注册表值设置HKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOMEC:\Windows\System32\ora112(不C:\Windows\SysWOW64\ora112)

你完成了!现在,您可以将x86和x64 Oracle客户端无缝连接在一起,即x86应用程序将加载x86库,x64应用程序将加载x64库,而无需对系统进行任何进一步修改.

用于创建符号链接的命令:

cd C:\Windows\System32
mklink /d ora112 C:\Oracle\11.2\Client_x64
cd C:\Windows\SysWOW64
mklink /d ora112 C:\Oracle\11.2\Client_x86

一些说明:

两个符号链接必须具有相同的名称,例如ora112.

如果您想在以后手动安装ODP.NET,请注意选择适当的文件夹进行安装.

尽管其名称文件夹C:\Windows\System32包含x64库,但C:\Windows\SysWOW64包含x86(32位)库.不要混淆.

例如,将TNS_ADMIN环境变量(TNS_ADMIN在Registry中的resp.条目)设置为公共位置可能是明智的选择TNS_ADMIN=C:\Oracle\Common\network.



6> 小智..:

在目标机器上安装ODP.Net,它应该解决问题...复制dll看起来不是一个好主意......



7> SKG..:

对于Oracle 11g(11.1.0.7.20),我必须添加以下dll以及我的Exe才能工作.

    OCI.DLL

    OraOps11w.dll

    oraociicus11.dll(非常接近30mb)

    Oracle.DataAccess.dll



8> psaxton..:

经过数小时的故障排除,我发现此问题是由我的项目bin目录中包含Oracle.DataAccess.dll(v4.0)引起的,但是运行时还从GAC加载了Oracle.DataAccess.dll(v2.x)。删除并阅读项目参考中的Oracle.DataAccess条目对我来说解决了这个问题。

在我看来,这里提到的其他文件似乎不是必需的。

更新

“提供程序与Oracle客户端版本不兼容”错误的根本原因是(通常)托管程序集试图加载与版本不匹配的非托管库。似乎可以通过在web.config中指定库路径来强制Oracle驱动程序使用正确的库1


  
    
      
      
    
  

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有