我正在尝试在我的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 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
我一直在研究这个问题,你只需要从相同的下载版本的ODP.Net中获取所有相应的DLL,并将它们放在与Exe文件相同的文件夹中,因为ODP.Net对于不混合而言非常挑剔版本号。
我在这里解释了如何做到这一点:http://splinter.com.au/using-the-new-odpnet-to-access-oracle-from-c以下是它的要点:
在我看来,虽然你有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:\oracle\bin"/>
<!-- ... -->
</settings>
</oracle.dataaccess.client>
</configuration>
的Oracle主目录下,我有一个名为C:\oracle\product\11.2.0
的文件夹,我之前安装了Windows 64位的client_1
位。ODP.NET
。然后我抓住了Windows 32位的ODP.NET
并安装了它,但我一直收到相同的错误信息。ODP.NET
和resinstalled client_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 100%托管提供程序)的组件。它由两部分组成:
简单来说,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:\oracle\product\1.1.0-xcopy-dep\BIN"/>
</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
只需两步就可以解决这个问题。
祝你好运。
您应该为启动器“忽略”所有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):
旧/手动方法:
有关如何转换为使用托管库的信息:
我没有走上获取新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
,即使它没有在任何配置文件中明确指定。这就是我收到错误的原因。
所以我做的是:
v4.121.0.0
(只是为了安全起见)。/bin
。/bin
,但它显示错误的版本:myWebSite.csproj
而不是v4.121.0.0
。v4.112.3.0
中的引用,现在读取:
myWebSite.csproj
我在安装适用于Visual Studio 2015的Oracle数据工具之后遇到了这个问题,然后与甲骨文进行了一段时间的斗争。我决定再次尝试重新安装Oracle客户端而不是文件复制,配置更改等等,这对我有用。
最近,我不得不处理一个较旧的项目,其中解决方案和所有包含的项目都针对x32平台。我一直试图在所有地方复制Oracle.DataAccess.dll和所有其他建议的Oracle文件,但每次都碰壁。最后,头部的灯泡点亮(8小时后:)),并要求检查已安装的ODAC组件及其平台。我已经安装了所有64位(x64)ODAC客户端,但没有安装32位(x32)。安装了32位ODAC,问题就消失了。
如何检查已安装的ODAC的版本:查看文件夹C:\ Windows \ assembly。 “处理器体系结构”属性将通知平台已安装的ODAC。
灯泡点亮需要8个小时。难怪我总是不得不工作:)。
克里斯的解决方案也适用于我。但是,我收到了一条跟踪错误消息,指出:
<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>
显然,在Oraclish的外语中,这意味着您的程序要么针对所有平台,要么针对32位计算机。只需将Project Properties中的目标平台更改为64位,并希望获得最佳效果。
我在Oracle.DataAccess.dll v4.121.2.0上遇到了同样的问题。与2-家庭安装(32和64位版本)。 32位版本的worker,64位版本没有。
在我的情况下(经过2天的尝试)我发现问题是64位家庭版本的权限。该版本中的许多目录都专门覆盖了权限,其中“Authenticated Users”角色没有“读取”访问权限,默认情况下在父目录中设置。那些子目录包括“bin”,“network / admin”,“nls”,“oracore”,“RDBMS”以及可能的其他目录。我通过从sysinternals过滤掉“进程监视器”(Procmon.exe)实用程序中的“访问已拒绝”结果来找到它们。一旦权限从父目录继承到那些子子目录,一切都开始起作用。
我没有覆盖整个oracle home上的权限,所以我一次只做了一个目录,但我想如果你不担心安全性那么多你可以在整个相应的oracle主目录上重置它。
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.
这里有很多理论答案,但是这里有一个代码的工作示例,您可以立即复制和粘贴并测试:
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath
HKLM\SOFTWARE\Wow6432Node\Oracle\...
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
,它只有4 MB,是一个纯粹的托管DLL,工作在32位和64位位进程也依赖于没有其他DLL,也不需要任何注册表项。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"]); } } } }
我只安装了用于.NET 2.0的Oracle数据提供程序(11.1.0.6.20),但我没有安装Oracle Instant Client(11.1.0.6.0)。
我刚安装它,错误消失了!
这可能是由针对32位Oracle客户端运行64位.NET运行时引起的。如果您的服务器在64位上运行应用程序,则会发生这种情况。它将运行64位运行时的.NET应用程序。您可以在VS中的项目上设置CPU标志,以便在32位运行时中运行。
让我们做一些总结:
错误消息“提供程序与Oracle客户端版本不兼容”可能由多种原因引起。
Oracle.DataAccess.dll
)不包含在Oracle Instant Client中,必须单独安装(从32-bit Oracle Data Access Components (ODAC) 或64-bit Oracle Data Access Components (ODAC) Downloads下载),或者您必须在Oracle Universal Installer(OUI)中选择相应选项。
请注意,在安装Oracle Data Provider> = 12.1时,提供程序不会自动注册到GAC中。如果需要,您必须手动注册,请参阅Oracle Doc 2272241.1。Oracle.DataAccess.dll
版本4.112.3.0与Oracle Client 11.2.0.4不兼容。仔细检查ODP.NET和Oracle Client的版本。您可以在sigcheck和/或oraociei*.dll
上使用OraOps*w.dll
来获取Oracle Client的版本。
注意不同的编号方案。文件版本4.112.3.0表示:.NET Framework版本4,Oracle版本11.2.0.3.x.
有ODP.NET版本“1.x”,“2.x”和“4.x”。这些数字与Microsoft .NET Framework版本1.0.3705 / 1.1.4322,2.0.50727和4.0.30319相关。版本“1.x”在Oracle Client 11.1之前可用。 Oracle Client 11.2引入了版本“4.x”Oracle.DataAccess.dll
版本(即编译时加载的版本)高于目标计算机上的版本。Oracle.DataAccess.dll
加载GAC,默认情况下,64-bit Oracle Data Access Components (ODAC) Downloads优先于任何本地提供的文件。解决方案
Oracle.ManagedDataAccess.dll
。在那里你只需要将*.csproj
文件复制到你的应用程序目录,不需要其他任何东西。它适用于32位和64位。*.vbproj
,resp。 <Reference Include="Oracle.DataAccess">
<SpecificVersion>False</SpecificVersion>
<Private>False</Private>
</Reference>
编辑您对ODP.NET的引用,如下所示:
Version=...
不需要像processorArchitecture=...
或Oracle.DataAccess.dll
这样的属性。
您的应用程序将根据所选的体系结构和目标.NET框架加载正确的Oracle.DataAccess.dll
(前提是它已正确安装)
- >未经100%验证OraClient11g_home1
它是为了得到一台非常干净的机器。假设:Oracle Home称为C:\Oracle\11.2\Client_x86
,客户端版本为11gR2。
C:\Oracle\11.2\Client_x64
C:\Windows\System32
ora112
并创建一个符号链接C:\Oracle\11.2\Client_x64
到文件夹C:\Windows\SysWOW64
(见下文)ora112
并创建一个符号链接C:\Oracle\11.2\Client_x86
到文件夹PATH
,(见下文)C:\Oracle\11.2\Client_x86
环境变量,用C:\Oracle\11.2\Client_x64
替换所有条目,如C:\Windows\System32\ora112
和\bin
,各自的C:\Windows\SysWOW64\ora112
子文件夹。注意:ORACLE_HOME
不得处于PATH环境中。C:\Windows\System32\ora112
设置为HKLM\Software\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME
C:\Windows\System32\ora112
设置为HKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME
(不是C:\Windows\System32\ora112
)用于创建符号链接的命令:
C:\Windows\SysWOW64\ora112
一些说明:
cd C:\Windows\System32
mklink /d ora112 C:\Oracle\11.2\Client_x64
cd C:\Windows\SysWOW64
mklink /d ora112 C:\Oracle\11.2\Client_x86
。ora112
包含x64库,而C:\Windows\System32
包含x86(32位)库。不要混淆。C:\Windows\SysWOW64
环境变量(在Registry中分配TNS_ADMIN
条目)设置为公共位置,例如TNS_ADMIN
。在目标机器上安装ODP.Net,它应该解决问题...复制dll看起来不是一个好主意......
对于Oracle 11g(11.1.0.7.20),我必须添加以下dll以及我的Exe才能工作。
在浪费了三个小时后,我的问题就是:
缺少OraOps11w.dll
为什么要生成“提供程序与Oracle客户端版本不兼容”错误消息?它必须是Oracle糟糕的编码/测试。我从1994年开始使用Oracle,自2002年以来多次使用.Net。它几乎总是很痛苦。
每个人都应该卸载Oracle并遵循上面的Chris解决方案(最佳答案)。这应该每次都有效
在StackOverflow上的另一篇文章中,这是如何卸载Oracle(忘记Oracle卸载工具,因为它无法正常工作):
Chris比我在Server 2003(32位)上的dll少。这就是我所拥有的:
TNS_ADMIN=C:\Oracle\Common\network
C:\ oracle \ instantclient是在全局路径和ORACLE_HOME环境变量中。 .Net代码引用C:\ oracle \ instantclient \ Oracle.DataAccess.dll
经过几个小时的故障排除后,我发现这个问题是由于我的项目bin目录中有Oracle.DataAccess.dll(v4.0)引起的,但是运行时也从GAC加载了Oracle.DataAccess.dll(v2.x)。删除和读取项目引用中的Oracle.DataAccess条目为我解决了这个问题。
在我的情况下,这里提到的其他文件似乎没有必要。
“提供程序与Oracle客户端版本不兼容”错误的根本原因(通常)托管程序集正在尝试加载与版本不匹配的非托管库。看来你可以通过在web.configC:\oracle\instantclient>dir /b
oci.dll
ociw32.dll
Oracle.DataAccess.dll
orannzsbb11.dll
oraocci11.dll
oraociei11.dll
OraOps11w.dll
Orasqlplusic11.dll
sqlplus.exe
tnsnames.ora
中指定库路径来强制Oracle驱动程序使用正确的库。
1