供应商与 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个回答

1

只需要两个步骤即可解决此问题。

  1. 进入应用程序池的高级设置,将“启用32位应用程序”标志设置为True。
  2. 确保您Bin文件夹中的所有Dll现在都是32位版本...

祝你好运。


@mazhar-abbas,您能指出我在哪里可以设置“启用32位应用程序”吗?是在IIS还是项目中? - hiFI

1
最近,我不得不处理一个旧项目,其中解决方案和所有包含的项目都针对x32平台。我一直试图将Oracle.DataAccess.dll和所有其他建议的Oracle文件复制到所有位置,但每次都遇到了障碍。最终,在8个小时后,我的脑海中灯泡亮起来,并要求检查已安装的ODAC程序集及其平台。我已经安装了所有64位(x64)ODAC客户端,但没有32位的(x32)。安装了32位ODAC后,问题消失了。
如何检查已安装的ODAC版本:查看C:\ Windows \ assembly文件夹。 "处理器架构"属性将通知已安装ODAC的平台。
八小时是让灯泡亮起来的漫长时间。难怪我总是在工作中努力 :)。

注意,C:\Windows\assemblies 只显示到 .NET Framework 版本 2.0 的程序集。版本 3.x/4.x 不会显示,参见 https://stackoverflow.com/questions/28213105/oracle-dataaccess-dll-not-shown-in-explorer-although-it-is-installed-in-gac - Wernfried Domscheit

1

我在安装了Visual Studio 2015的Oracle数据工具后遇到了这个问题,然后与Oracle搏斗了一个小时。我决定再次尝试重新安装Oracle客户端,而不是通过文件复制、配置更改等方式解决这个问题,对我来说这种方法行得通。


1
我们遇到了同样的问题,因为网络共享上的Oracle.Data.dll程序集被我们的DBA更新了。从项目中删除引用,然后再次添加解决了这个问题。

0

我也遇到了Oracle.DataAccess.dll v4.121.2.0的同样问题,因为我安装了32位和64位版本的两个home。32位版本可以工作,但64位版本无法工作。

在我的情况下(尝试了两天后),我发现问题出在64位home版本的权限上。许多目录在该版本中都有独占的覆盖权限,其中“已验证用户”角色没有“读取”访问权限,这是默认设置在父目录上的。这些子目录包括“bin”,“network/admin”,“nls”,“oracore”,“RDBMS”和可能还有其他的。我通过在sysinternals的“Process Monitor”(Procmon.exe)实用程序中过滤出“ACCESS DENIED”结果来找到它们。一旦从父目录继承了这些子目录的权限,一切就开始正常工作了。

我不想覆盖整个oracle home的权限,所以我一个目录一个目录地进行了操作,但我想如果您不太担心安全问题,您可以在整个相应的oracle home目录上重置它。


0

0

Chris 的解决方案对我也起作用了。不过,我收到了一个跟随错误消息,其内容是:

Could not load file or assembly 'Oracle.DataAccess' or one of its dependencies. An attempt was made to load a program with an incorrect format.

显然,在Oraclish的外语中,这意味着您的程序要么针对所有平台,要么针对32位机器。 只需在项目属性中更改目标平台为64位,并希望一切顺利。


3
这实际上是.NET式的,而不是Oracle式的。 - Jay Sullivan

-3

这里有很多理论答案,但是现在我给出一个带有代码的工作示例,您可以复制粘贴并立即测试:

  1. 我安装了Oracle Express数据库OracleXE112,它已经预装了一些演示表。
  2. 当您启动安装程序时,会要求您输入密码。我输入了“xxx”作为密码。(不用于生产)
  3. 我的服务器运行在机器192.168.1.158上。
  4. 在服务器上,您必须明确允许Windows防火墙中的TNSLSNR.exe进程访问。此进程侦听端口1521。如果您从下面的代码中获得超时错误,请检查您的防火墙。
  5. 选项A:对于C#(.NET2或.NET4),您可以下载ODAC11,其中您必须将Oracle.DataAccess.dll添加到您的项目中。此外,此DLL依赖于:OraOps11w.dll、oci.dll、oraociei11.dll(130MB!)、msvcr80.dll。这些DLL必须与EXE位于同一目录中,或者您必须在以下位置指定DLL路径:HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath。在64位机器上,还要写入HKLM\SOFTWARE\Wow6432Node\Oracle\...
  6. 选项B:如果您已经下载了ODAC12,则需要Oracle.DataAccess.dll、OraOps12w.dll、oci.dll、oraociei12.dll(160MB!)、oraons.dll、msvcr100.dll。注册表路径为HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
  7. 选项C:如果您不想下载超过100 MB的巨大DLL,则应下载ODP.NET_Managed12.x.x.x.xxxxx.zip,其中包含Oracle.ManagedDataAccess.dll,它仅为4 MB,并且是纯托管DLL,适用于32位和64位进程,不依赖于任何其他DLL,也不需要任何注册表条目。
  8. 以下C#代码在服务器端没有任何配置即可正常工作(只需默认安装):
使用 Oracle.DataAccess.Client; 或者 使用 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"]); } } } }

当你只需要一个运行的客户端时,安装整个Oracle数据库服务器可能有些过度。 - Wernfried Domscheit
你的评论表明你没有看过我的回答。如果我想编写一个与Oracle服务器通信的应用程序,就不需要安装任何来自Oracle的东西。我只需使用上述提到的DLL并将其与我的应用程序一起分发即可。因此,在最终用户的计算机上不会有任何PATH变量。顺便说一句,使用PATH变量(它来自1980年的旧DOS时代)在现代软件中已经高度弃用。我的回答建议选择选项C,它不需要任何注册表路径,并且不依赖于32位或64位。我提到选项A和B仅是为了完整性。 - Elmue
我认为如果没有正确设置%PATH%,你的Windows甚至在10版本中也无法正常工作。我在我的答案中提到,手动复制任何Oracle dll文件到应用程序中是不明智的。我不知道这些dll文件的源代码,但可能存在更多依赖项在客户端上,而你看不到,例如由语言设置、字符集、时区等触发的依赖项。当我使用Oracle.DataAccess.dll进行跟踪时,程序总共加载了35个Oracle DLL文件!最好进行正常的Oracle Client安装-除非你使用ODP.NET Managed driver。 - Wernfried Domscheit
你没有告诉我任何新的信息。因此,我描述了OPTION C的优点,这显然是推荐的选项。但它只能在C#项目中使用。对于C++项目,OPTION C没有用处。最后,所有这些讨论只表明你没有仔细阅读我写的内容或者你没有理解。那么为什么要对我的答案进行负评,而我的答案是100%正确的呢? - Elmue
1
我认为我提到了我的疑虑:(1)安装数据库是无用的,即过度杀伤力。(2)选项A和B仅在特定条件下工作,例如它不会从注册表中读取任何NLS设置(您需要文件oracle.key)。为了兼容性,您还需要考虑较小的版本。例如,Oracle.DataAccess,Version=2.112.2.0无法与OraOps11w.dll版本2.112.4.0一起使用。 - Wernfried Domscheit
显示剩余4条评论

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