供应商与 Oracle 客户端版本不兼容。

171
我正在尝试将Oracle ODP.NET 11g (11.1.0.6.20) Instant Client作为数据提供程序在我的ASP.net项目中使用,但是当我运行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
28个回答

3

我觉得虽然你已经安装了Oracle Istant Client,但是ODP还是可能会尝试使用实际的Oracle客户端。你的机器上也安装了标准的Oracle客户端吗?我记得当涉及到同一台机器上有多个客户端时,Oracle非常挑剔。


3

TLDR版本:

  • 请使用12c 100% managed provider
  • 如果您必须使用旧的提供程序,则需要将Oracle.DataAccess.dll指向未管理的正确版本的Oracle Client Dlls。如果您在计算机上安装了多个Oracle客户端,则可能只需在应用程序配置中包含“DllPath”配置变量(请参见下文),但您还可能需要安装新的oracle客户端以进行指向。

完整版本:

首先,让我们确保我们理解旧的未管理提供程序(而不是新的12c 100%托管提供程序)的组件。它由两个部分组成:

  1. 托管的.NET组件-Oracle.DataAccess.dll
  2. 非托管(非.NET)客户端

简单地说,Oracle.DataAccess.dll几乎只是一个包装器,将.NET指令转换为未管理客户端的ORACLE-NET指令。

当您加载Oracle.DataAccess时,它会按顺序查找需要的非托管客户端dll文件。根据Oracle文档:
Oracle.DataAccess.dll根据以下顺序搜索相关的非托管DLL(如Oracle Client):
1.应用程序或可执行文件的目录。
2.由应用程序配置或web.config指定的DllPath设置。
3.由machine.config指定的DllPath设置。
4.由Windows注册表指定的DllPath设置。
HKEY_LOCAL_MACHINE\Software\Oracle\ODP.NET\version\DllPath
5.Windows PATH环境变量指定的目录。
因此,在您的情况下,您的应用程序按照上述过程进行,并发现了一个路径,该路径具有相对于您正在使用的Oracle.DataAccess.dll程序集太旧的非托管dll文件。

可能是因为该机器上唯一的Oracle客户端安装版本太旧了。但如果在计算机上安装了多个客户端,并且未管理的文件首先在另一个较旧的安装中被找到,则会出现这种情况。如果是后者,简单的解决方法是在您的配置中使用dllPath配置变量,并将其指向正确的Oracle Home Bin文件夹:

<configuration>
  <oracle.dataaccess.client> 
    <add key="DllPath" value="c:\oracle\product\1.1.0-xcopy-dep\BIN"/>
  </oracle.dataaccess.client>
</configuration>

如果您想安装客户端的新副本,xcopy版本是最小的,包含“即时客户端”,并将DllPath指向此新位置。但任何Oracle客户端安装都可以使用。
但是,如果您想避免所有这些非托管客户端解析问题,请尝试更新应用程序以改用100%托管提供程序 - 它确实只是一个或两个托管程序集,没有任何依赖于非托管文件。
如果Oracle.DataAccess.dll同时安装在bin目录和GAC中,则有可能加载的不是您认为的那个文件,但我认为这种情况不太可能发生。有关更多信息,请参见程序集解析过程

2

我没有选择获取新的DLL。我们有许多现有的项目可以正常工作,只有我的新项目让我头疼,所以我决定尝试其他方法。

我的项目使用了一个内部开发的Internal.dll,该文件依赖于Oracle.DataAccess.dll v4.112.3.0。由于某种原因,在发布时,Visual Studio总是上传v4.121.0.0,即使在任何配置文件中都没有明确指定。这就是我遇到错误的原因。

所以我做的是:

  1. Copied Internal.dll from one of the successfully running projects to my web site's /bin (just to be on the safe side).
  2. Copied Oracle.DataAccess.dll from one of the successfully running projects to my web site's /bin.
  3. Add Reference to both of them from my web site.
  4. Finally Oracle.DataAccess reference showed up in myWebSite.csproj, but it showed the wrong version: v4.121.0.0 instead of v4.112.3.0.
  5. I manually changed the reference in myWebSite.csproj, so it now read:

    <Reference Include="Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>bin\Oracle.DataAccess.dll</HintPath>
    </Reference> 
    

3
在bin文件夹中添加dll引用是一个非常糟糕的想法。 - Jay Sullivan
2
“bin”和“obj”文件夹是输出文件夹,这是在构建项目时dlls的存放位置。 您应该能够随时删除这些文件夹而不会创建冲突。 通常,这些文件夹在源代码控制中被忽略。 标准做法是创建一个“外部引用”文件夹,将已引用的dlls放入其中。 - Jay Sullivan
@notfed 看来你是对的。我会记住这个的。 - Robotronx
正如其名,它只是编译器的一个提示路径,而不是强制引用。首先,在全局程序集缓存中搜索 Oracle.DataAccess.dll。即使您完全删除HintPath,它也应该能够工作。 - Wernfried Domscheit

2

同时,你还需要查找IIS应用程序池中的“启用32位”选项,当你看到这个信息时,有些Oracle论坛会引导你去查找此选项!


2

1
兄弟...Oracle...我们能谈一下吗?来这边,到角落里。听着,我花了一整天的时间才搞明白“提供程序不兼容”到底是什么意思,结果后来发现是因为某个安装依赖项没有满足。请你——不——我要求你在安装时检查这些依赖项,并在未满足时警告用户。谢谢。 - Jay Sullivan
3
顺便提一下,我不得不多次回到这个stackoverflow的问题上,每次都有不同的答案适用于我。这浪费了我的时间和金钱。 - Jay Sullivan

2

IIS/IWAM用户是否对Oracle目录具有权限?您能否使用其他应用程序(例如Excel或Access)连接到此数据源?


2

我曾经有完全相同的问题。在编译应用程序后,我删除了(并忘记了删除)oraociei11.dll。当尝试执行时,它会出现这个错误。因此,当无法找到该oraociei11.dll库文件时,就会显示这个错误。可能还有其他情况会导致出现这种错误,但这似乎是其中之一。


2
如果您有多个Oracle客户端,或者引用了不同版本的Oracle引用,则可能会出现此问题。解决方法有两种:
  1. 第一种快速解决方案是删除非托管引用,并使用NuGet中的托管引用。在选择此选项之前,请查看ODP.NET托管驱动程序和非托管驱动程序之间的区别
  2. 第二种解决方案是修复项目的非托管目标版本,如下所示:
  • 首先检查Oracle项目引用版本(从项目引用/(依赖项>程序集)> Oracle.DataAccess右键单击 > 属性):

    enter image description here

    enter image description here

然后检查Oracle GAC版本。

  • 打开运行窗口(Win+R),输入 "%windir%\Microsoft.NET\assembly" 进入 GAC 文件夹。
    enter image description here

  • 检查与项目平台匹配的平台版本。

    enter image description here

  • 检查目标平台版本(右键单击项目 > 属性)。

    enter image description here

  • 从 GAC 文件夹中搜索 Oracle.DataAccess。

    enter image description here

  • 右键单击 Oracle.DataAccess,选择“属性”>“详细信息”,检查版本号。

    enter image description here

  • 如果您发现版本不同,则需要重定向程序集版本(在启动项目中打开配置文件并添加以下部分)。

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89b483f429c47342" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="4.121.2.0" />
      </dependentAssembly>
</assemblyBinding>

像这样 在此输入图片描述

旧版本:应覆盖您的项目版本 新版本:GAC版本 公钥令牌:来自GAC

在此输入图片描述


1
所以,对于仍在与这个问题作斗争的人,请记住以下两点:
1. 您需要哪个版本的Oracle数据库客户端。 2. 您需要32位还是64位版本。这两个取决于您的应用程序和Oracle.DataAccess .dll版本。
我一直遇到这个错误,是因为我没有安装正确的Oracle数据库客户端版本。我只安装了19c,但我需要的是11g。您可以安装多个版本而不会有任何问题。
在安装了32位11g Oracle数据库客户端之后,问题终于解决了。您可以在Oracle的软件交付云中找到更早的Oracle数据库客户端版本,只需仔细寻找,它们就在那里。

1
我曾遇到类似的问题,根本原因是GAC中有两个oracle.dataaccess版本,即v4.0_4.112.2.0和v4.0_4.112.4.0。我的应用程序使用的是v4.0_4.112.2.0,所以当我从GAC中删除了v4.0_4.112.4.0后,它就能正常工作了。
GAC路径:C:\Windows\Microsoft.NET\assembly\GAC_64\Oracle.DataAccess
之前: enter image description here 之后: enter image description here 要删除一个版本,只需从GAC中删除相应的文件夹即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接