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

Eve*_*ner 156 c# asp.net oracle odp.net oracleclient

我正在尝试在我的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();
Run Code Online (Sandbox Code Playgroud)

页面的错误如下所示:

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
Run Code Online (Sandbox Code Playgroud)

Chr*_*ris 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*_*son 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认同)

Eve*_*ner 35

我只安装了用于.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) (3认同)
  • @Chris:是的,你可以.根据我的经验,你需要oci.dll,orannzsbb11.dll,oraociicus11.dll,oraops11w.dll和oracle.dataaccess.dll (2认同)

Dan*_*iel 32

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


Wer*_*eit 22

让我们做一些总结:

错误消息"提供程序与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的版本.您可以使用sigcheckoraociei*.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的引用,如下所示:

    <Reference Include="Oracle.DataAccess">
      <SpecificVersion>False</SpecificVersion>
      <Private>False</Private>
    </Reference>
    
    Run Code Online (Sandbox Code Playgroud)

    属性喜欢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
Run Code Online (Sandbox Code Playgroud)

一些说明:

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

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

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

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

  • 当您使用 ODP.NET 托管驱动程序时,不需要安装任何 Oracle 客户端 - 这是它的主要优点。它适用于 x86 和 x64 应用程序。如果没有“ODP.NET 托管驱动程序”,x86 应用程序也需要一个 x86(即 32 位)Oracle 客户端,无论数据库服务器架构是什么。 (2认同)

小智 5

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


SKG*_*SKG 5

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

  1. OCI.DLL
  2. OraOps11w.dll
  3. oraociicus11.dll(非常接近30mb)
  4. Oracle.DataAccess.dll


psa*_*ton 5

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

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

更新

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

<configuration>
  <oracle.dataaccess.client>
    <settings>
      <add name="DllPath" value="C:\oracle\bin"/>
      <!-- ... -->
    </settings>
  </oracle.dataaccess.client>
</configuration>
Run Code Online (Sandbox Code Playgroud)