C# 提供程序与Oracle客户端的版本不兼容
我试图在ASP.NET项目上使用Oracle ODP.NET 11g(11.1.0.6.20)即时客户端作为数据提供程序,但当我运行aspx页面时,我收到一条“提供程序与Oracle客户端版本不兼容”错误消息。任何帮助都将不胜感激 我在Visual Studio 2005中引用了数据提供程序,其背后的代码如下所示: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();
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#可执行文件相同的文件夹中
还要查找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目录
解决这个问题只需两个步骤
祝你好运。最近我不得不处理一个旧项目,其中解决方案和所有包含的项目都是针对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
bitsODP.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"]);
}
}
}
}