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

C# 提供程序与Oracle客户端的版本不兼容,c#,asp.net,oracle,odp.net,oracleclient,C#,Asp.net,Oracle,Odp.net,Oracleclient,我试图在ASP.NET项目上使用Oracle ODP.NET 11g(11.1.0.6.20)即时客户端作为数据提供程序,但当我运行aspx页面时,我收到一条“提供程序与Oracle客户端版本不兼容”错误消息。任何帮助都将不胜感激 我在Visual Studio 2005中引用了数据提供程序,其背后的代码如下所示: using Oracle.DataAccess.Client; .. OracleConnection oOracleConn = new OracleConnection();

我试图在ASP.NET项目上使用Oracle ODP.NET 11g(11.1.0.6.20)即时客户端作为数据提供程序,但当我运行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
<Reference Include="Oracle.DataAccess">
  <SpecificVersion>False</SpecificVersion>
  <Private>False</Private>
</Reference>
页面的错误如下所示:

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
<Reference Include="Oracle.DataAccess">
  <SpecificVersion>False</SpecificVersion>
  <Private>False</Private>
</Reference>

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

在我看来,尽管Oracle iStat客户端具有ODP,但ODP可能会尝试使用实际的Oracle客户端。机器上是否也安装了标准Oracle客户端?我记得Oracle对同一台机器上的多个客户端非常挑剔。

我只安装了Oracle Data Provider for.NET 2.0(11.1.0.6.20),没有安装Oracle Instant Client(11.1.0.6.0)


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

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

我也有同样的问题。编译应用程序后,我删除了(并且忘记了我已经删除了)oraociei11.dll。它在试图执行时给出了这个错误。因此,当它找不到oraociei11.dll所在的dll时,它会显示此错误。当它给出这个错误时,可能还有其他情况,但这似乎是其中之一。

我一直在进一步研究这个问题,您只需从同一下载版本的ODP.Net中获取所有适当的DLL,并将它们放在与Exe文件相同的文件夹中,因为ODP.Net对不混合版本号很挑剔

我已经在这里解释了如何做到这一点: 不过,以下是要点:

  • 下载ODP.Net
  • 解压缩文件
  • 把罐子里的东西都解开
  • 抓取这些刚解压缩的dll:
    • oci.dll(从“oci.dll.dbl”重命名)
    • Oracle.DataAccess.dll
    • oraociicus11.dll
    • OraOps11w.dll
    • orannzsb11.dll
    • Oracioc11.dll
    • ociw32.dll(从“ociw32.dll.dbl”重命名)
  • 将所有DLL放在与C#可执行文件相同的文件夹中

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

对于Oracle 11g(11.1.0.7.20),我必须将以下dll与Exe一起添加才能工作

  • oci.dll
  • OraOps11w.dll
  • oraociicus11.dll(相当大,接近30mb)
  • Oracle.DataAccess.dll

  • 还要查找IIS应用程序池启用32位真或假标志,当您看到此消息时,一些oracle论坛向我指示了此消息

    我们也遇到了同样的问题,因为网络共享上的Oracle.Data.dll程序集是由我们的DBA更新的。从项目中删除引用并再次添加它解决了问题。

    我也有同样的问题,但在我的情况下,我不能将DLL复制到bin文件夹中,然后我只能“重新绑定”程序集版本

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <runtime>    
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342" culture="neutral"/>
            <bindingRedirect oldVersion="2.112.2.0" newVersion="2.112.1.0"/>
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
    </configuration>
    
    
    
    • 在64位计算机上,将“msvcr71.dll”从C:\Windows\SysWOW64复制到 应用程序的bin目录
    • 在32位计算机上,将“msvcr71.dll”从C:\Windows\System32复制到 应用程序的bin目录

    解决这个问题只需两个步骤

  • 转到应用程序池的高级设置,并将“启用32位应用程序”标志设置为True
  • 请确保您的Bin中的所有DLL现在都是32位版本

  • 祝你好运。

    最近我不得不处理一个旧项目,其中解决方案和所有包含的项目都是针对x32平台的。我一直试图在所有地方复制Oracle.DataAccess.dll和所有其他建议的Oracle文件,但每次都失败了。最后,头部的灯泡点亮(8小时后:),并要求检查已安装的ODAC组件及其平台。我已经安装了所有64位(x64)ODAC客户端,但没有安装32位(x32)。安装了32位ODAC后,问题消失了

    如何检查已安装ODAC的版本:在文件夹C:\Windows\assembly中查找。“处理器架构”属性将通知平台已安装的ODAC


    八个小时是灯泡点亮的很长时间。难怪我总是要在工作中苦苦挣扎:)。

    以下是我为解决这个持续了3个小时的问题所做的:

  • 在位于
    C:\Oracle\product\11.2.0
    的Oracle主页下,我有一个名为
    client_1
    的文件夹,我以前在那里安装了Windows 64位的
    ODP.NET
    bits

  • 后来,在尝试使用Visual Studio 2012调试我的ASP.NET Web API应用程序时,我不断收到以下错误消息:提供程序与Oracle客户端版本不兼容

  • 搜索谷歌时,我发现这是因为我使用的是
    ODP.NET
    64位。然后我抓取了适用于Windows 32位的
    ODP.NET
    ,并安装了它,但我一直收到相同的错误消息

  • 解决方案:删除文件夹
    client_1
    并重新安装
    ODP.NET
    32位。安装程序在某种程度上混合了64位版本和32位版本中的位。想想看

  • 现在我又高兴了,我可以打开一个新的
    OracleConnection
    。最后!:)


  • 经过几个小时的故障排除,我发现这个问题是由projects bin目录中的Oracle.DataAccess.dll(v4.0)引起的,但是运行时
    <configuration>
      <oracle.dataaccess.client> 
        <add key="DllPath" value="c:\oracle\product\1.1.0-xcopy-dep\BIN"/>
      </oracle.dataaccess.client>
    </configuration>
    
    using Oracle.DataAccess.Client; or using Oracle.ManagedDataAccess.Client; .... string oradb = "Data Source=(DESCRIPTION=" + "(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.158)(PORT=1521)))" + "(CONNECT_DATA=(SERVER=DEDICATED)));" + "User Id=SYSTEM;Password=xxx;"; using (OracleConnection conn = new OracleConnection(oradb)) { conn.Open(); using (OracleCommand cmd = new OracleCommand()) { cmd.Connection = conn; cmd.CommandText = "select TABLESPACE_NAME from DBA_DATA_FILES"; using (OracleDataReader dr = cmd.ExecuteReader()) { while (dr.Read()) { listBox.Items.Add(dr["TABLESPACE_NAME"]); } } } }