提供程序与Oracle客户端版本不兼容
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了提供程序与Oracle客户端版本不兼容相关的知识,希望对你有一定的参考价值。
我正在尝试在我的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();
页面的错误如下所示:
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 SettingsCE218CDesktopIVX.NetWebIVXRoyTesting.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
我一直在研究这个问题,你只需要从相同的下载版本的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相同的文件夹中
在我看来,虽然你有ODP与Oracle Istant客户端,但ODP可能会尝试使用实际的Oracle客户端。您是否在计算机上安装了标准Oracle客户端?我记得Oracle在同一台机器上遇到多个客户端时非常挑剔。
我有同样的问题。我在编译应用程序后删除了(并忘了我已删除)oraociei11.dll。并且它在尝试执行时发出此错误。所以当它无法找到oraociei11.dll的dll时,它会显示此错误。当它出现此错误时可能还有其他情况,但这似乎是其中之一。
另外查找IIS应用程序池启用32位真或假标志,当你看到这条消息时,一些oracle论坛指导我这个!
这是我为解决这个持续3个小时的问题所做的工作:
- 在位于
<configuration> <oracle.dataaccess.client> <settings> <add name="DllPath" value="C:oraclein"/> <!-- ... --> </settings> </oracle.dataaccess.client> </configuration>
的Oracle主目录下,我有一个名为C:oracleproduct11.2.0
的文件夹,我之前安装了Windows 64位的client_1
位。 - 稍后在尝试使用Visual Studio 2012调试我的ASP.NET Web API应用程序时,我不断收到此错误消息:提供程序与Oracle客户端版本不兼容。
- 搜索谷歌我发现这发生了,因为我使用的是64位的
ODP.NET
。然后我抓住了Windows 32位的ODP.NET
并安装了它,但我一直收到相同的错误信息。 - 解决方案:删除文件夹
ODP.NET
和resinstalledclient_1
32位。安装程序有点混合了64位版本和32位版本的位。去搞清楚... - 现在我又开心了,我可以打开一个新的
ODP.NET
。最后! :)
对于仍然有这个问题的人:基于这篇文章
OracleConnection
我发现我的服务器缺少Microsoft C ++ Visual Runtime Library - 因为安装了Visual Studio,我在dev机器上安装了它。我从这里下载并安装了(当前)最新版本的库:
http://oradim.blogspot.com/2009/09/odpnet-provider-is-not-compatible-with.html
跑了设置和来自C#的oracle调用吧!
TLDR版本:
- 请改用12c http://www.microsoft.com/en-us/download/details.aspx?id=13523。
- 如果必须使用旧提供程序,则需要将Oracle.DataAccess.dll指向具有正确版本的非托管Oracle Client Dll。如果您的计算机上安装了多个Oracle客户端,可能很简单,在您的应用程序配置中包含“DllPath”配置变量(见下文),但您可能还需要安装新的oracle客户端以指向。
完整版本:
首先,让我们确保了解旧的未经授权的提供程序(而不是新的12c 100%托管提供程序)的组件。它由两部分组成:
- 托管的.net组件 - Oracle.DataAccess.dll
- 非托管(非网络)客户端
简单来说,Oracle.DataAccess.dll几乎只是一个包装器,将.net指令转换为非托管客户端的ORACLE-NET指令。
也就是说,当您加载Oracle.DataAccess时,它会尝试查找所需的非托管客户端dll。来自100% managed provider:
Oracle.DataAccess.dll根据以下顺序搜索依赖的非托管DLL(例如Oracle Client):
1.应用程序或可执行文件的目录。
2.应用程序配置或web.config指定的DLL路径设置。
3.由machine.config指定的DllPath设置。
4. Windows注册表指定的DLL路径设置。
HKEY_LOCAL_MACHINE SOFTWARE ORACLE ODP.NET 版本 DllPath的
5. Windows PATH环境变量指定的目录。
因此,在您的情况下,您的应用程序遵循上述过程,并找到了一条路径,该路径具有相对于您正在使用的Oracle.DataAccess.dll程序集而言过于陈旧的无法使用的dll。
可能只是该机器上唯一的Oracle客户端安装太旧了。但是,如果您在计算机上安装了多个客户端并且首先在不同但较旧的安装中找到了非管理文件,则会发挥作用。如果是后者,最简单的方法是在配置中使用dllPath配置变量并将其指向正确的Oracle Home Bin文件夹:
Oracle Documentation
如果要安装客户端的新副本,<configuration>
<oracle.dataaccess.client>
<add key="DllPath" value="c:oracleproduct1.1.0-xcopy-depBIN"/>
</oracle.dataaccess.client>
</configuration>
是最小的并包含“即时客户端”并将DllPath指向上面的新位置。但任何oracle客户端安装都可以。
但是如果你想避免所有这些非托管客户端解析的东西,看看你是否可以更新你的应用程序以使用100%托管提供程序 - 它实际上只是一个或两个托管程序集,而不依赖于无人文件。
如果它安装在bin目录和GAC中,你也可能没有加载你认为你的Oracle.DataAccess.dll,但我认为这是不太可能的senario。有关更多信息,请参阅xcopy version。
IIS / IWAM用户是否拥有Oracle目录的权限?您可以使用其他应用程序(例如Excel或Access)连接到此数据源吗?
我们遇到了同样的问题,因为我们的DBA更新了网络共享上的Oracle.Data.dll程序集。从项目中删除引用,并再次添加它解决了问题。
我有同样的问题,但在我的情况下,我不能只将dll复制到bin文件夹,然后我只“重新绑定”程序集版本。
assembly resolution process
只需两步就可以解决这个问题。
- 继续设置应用程序池并将“启用32位应用程序”标志设置为True。
- 确保Bin中的所有Dll现在都是32位版本...
祝你好运。
您应该为启动器“忽略”所有x86 / x64对话,而是尝试使用ODP.NET托管驱动程序(如果您使用的是.Net v4 +):
https://www.nuget.org/packages/Oracle.ManagedDataAccess/
https://www.nuget.org/packages/Oracle.ManagedDataAccess.EntityFramework/
Oracle ODP.net Managed vs Unmanaged Driver
避免所有“非托管”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
我没有走上获取新DLL的道路。我们有一堆现有项目完美无缺,只有我的新项目给我带来了麻烦所以我决定尝试其他的东西。
我的项目使用的是内部开发的依赖于Oracle.DataAccess.dll <?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>
的Internal.dll。出于某种原因,在发布时,Visual Studio总是上传v4.112.3.0
,即使它没有在任何配置文件中明确指定。这就是我收到错误的原因。
所以我做的是:
- 将一个成功运行的项目中的Internal.dll复制到我的网站的
v4.121.0.0
(只是为了安全起见)。 - 将Oracle.DataAccess.dll从一个成功运行的项目复制到我的网站的
/bin
。 - 从我的网站添加对它们的引用。
- 最后Oracle.DataAccess参考出现在
/bin
,但它显示错误的版本:myWebSite.csproj
而不是v4.121.0.0
。 - 我手动更改了
v4.112.3.0
中的引用,现在读取:myWebSite.csproj
我在安装适用于Visual Studio 2015的Oracle数据工具之后遇到了这个问题,然后与甲骨文进行了一段时间的斗争。我决定再次尝试重新
以上是关于提供程序与Oracle客户端版本不兼容的主要内容,如果未能解决你的问题,请参考以下文章
Oracle 数据库 - 使用UEStudio修改dmp文件版本号,解决imp命令恢复的数据库与dmp本地文件版本号不匹配导致的导入失败问题,“ORACLE error 12547”问题处理(代码片段
为啥navicat连接oracle数据库以及新建查询时会闪退