我正在尝试在我的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
Chris.. 90
我一直在研究这个问题,你只需要从相同的下载版本的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相同的文件夹中
另外,我在我的开发机器上使用了最新版本的ODAC(11.2.0.1.2),我需要的唯一文件是:oci.dll,Oracle.DataAccess.dll,oraociei11.dll,OraOps11w.dll.正如克里斯指出的那样,请确保他们在同一个文件夹中作为您的可执行文件.;-) (10认同)
您的解决方案对我有用 - 在我找到之前找到了您的博客文章.你就是男人.谢谢!:-)另外,使用最新版本的ODAC,我不需要解压缩任何JAR ... .dll文件位于我的oracle主目录中的各个目录中.一个简单的Windows搜索非常快速地启动了它们. (4认同)
Tod Thomson.. 45
您应该为启动器"忽略"所有x86/x64对话,而是尝试使用ODP.NET托管驱动程序(如果您使用的是.Net v4 +):
https://www.nuget.org/packages/Oracle.ManagedDataAccess/
https://www.nuget.org/packages/Oracle.ManagedDataAccess.EntityFramework/
Oracle ODP.net托管与非托管驱动程序
避免所有"非托管"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
大家都知道,虽然托管服务提供商很好,但它缺乏完整提供商允许的许多功能.即,Oracle内置加密功能. (5认同)
好消息是Oracle最终拥有一个完全托管的驱动程序.拖着100mb dll是一个真正的负担. (3认同)
最后.这个完全超过了我,谢谢. (3认同)
使用托管驱动程序是最终的解决方案!每当我认为我遇到类型不匹配的所有时间时,我都会感到非常沮丧 (2认同)
EverTheLearn.. 35
我只安装了用于.NET 2.0的Oracle数据提供程序(11.1.0.6.20),但我没有安装Oracle Instant Client(11.1.0.6.0).
我刚安装它,错误消失了!
我一直在研究这个问题,你只需要从相同的下载版本的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相同的文件夹中
您应该为启动器"忽略"所有x86/x64对话,而是尝试使用ODP.NET托管驱动程序(如果您使用的是.Net v4 +):
https://www.nuget.org/packages/Oracle.ManagedDataAccess/
https://www.nuget.org/packages/Oracle.ManagedDataAccess.EntityFramework/
Oracle ODP.net托管与非托管驱动程序
避免所有"非托管"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
我只安装了用于.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客户端.在这种情况下,错误消息确实具有误导性.
Oracle Data Oracle.DataAccess.dll
Client for .NET(ODP.NET,即文件)不包含在Oracle Instant Client中,必须单独安装(从32位Oracle数据访问组件(ODAC)或64位Oracle数据访问组件下载( ODAC)下载)或您必须在Oracle Universal Installer(OUI)中选择相应的选项.
请注意,在安装Oracle Data Provider> = 12.2时,提供程序不会自动注册到GAC中.如果需要,您必须手动注册,请参阅Oracle Doc 2272241.1.
ODP.NET的版本与安装的Oracle客户端版本不匹配.你必须检查次要版本号!例如,Oracle.DataAccess.dll
版本4.112.3.0与Oracle Client 11.2.0.4不兼容.仔细检查ODP.NET和Oracle Client的版本.您可以使用sigcheck上oraociei*.dll
和/或OraOps*w.dll
获得Oracle客户端的版本.
注意不同的编号方案.文件版本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"
ODP.NET的体系结构(32位或64位)与您的应用程序体系结构不匹配.32位应用程序仅适用于32位Oracle Client/ODP.NET,64位应用程序需要64位Oracle Client/ODP.NET.(除非您使用ODP.NET托管驱动程序)
.NET Framework版本不匹配.例如,如果使用Target .NET Framework 2.0编译应用程序,则无法使用ODP.NET版本4.x. .NET Framework目标版本必须等于或高于ODP.NET的版本.
的版本Oracle.DataAccess.dll
在开发机器上(即这是在编译时加载的版本)比目标机上的版本更高.
请注意,Oracle.DataAccess.dll
可能会从GAC加载,默认情况下,GAC优先于任何本地提供的文件.
解决方案
考虑使用ODP.NET托管驱动程序,它可以从Oracle页面下载:64位Oracle数据访问组件(ODAC)下载.在那里你只需要将Oracle.ManagedDataAccess.dll
文件复制到你的应用程序目录,不需要其他任何东西.它适用于32位和64位.
在你的*.csproj
,相应的.*.vbproj
编辑您对ODP.NET的引用,如下所示:
False False
属性喜欢Version=...
或processorArchitecture=...
不是必需的.您的应用程序将加载正确的, - >未经100%验证Oracle.DataAccess.dll
具体取决于所选的体系结构和目标.NET框架(前提是它已正确安装)
如果您不知道目标计算机上的Oracle客户端版本(例如,它可能是您客户的计算机):转到上面提到的下载页面并下载最少的XCopy版本的Oracle数据访问组件.解压缩zip并将文件仅复制Oracle.DataAccess.dll
到本地计算机.在你的VS项目中引用这个(很可能是过时的)DLL.此DLL的版本是您的应用程序将使用的最低版本的ODP.NET.运行应用程序时,GAC中的发布者策略将重定向到实际安装的版本.
我不认为采用单个DLL并将它们复制到某些文件夹是一种聪明的方法.它可以在"裸机"上运行,但如果您的目标机器安装了任何Oracle产品,则版本不匹配的风险很高.从您的计算机上卸载所有Oracle产品并进行全新安装.看看如何卸载/完全删除Oracle 11g(客户端)?它命令得到一个非常干净的机器.
如果您必须同时使用32位和64位应用程序,请按照此说明在一台计算机上安装两个版本:
假设:调用Oracle Home OraClient11g_home1
,客户端版本为11gR2.
(可选)删除已安装的任
例如,下载并安装Oracle x86客户端 C:\Oracle\11.2\Client_x86
将Oracle x64 Client下载并安装到不同的文件夹中,例如 C:\Oracle\11.2\Client_x64
打开命令行工具,转到文件夹%WINDIR%\ System32,通常C:\Windows\System32
创建一个指向ora112
文件夹的符号链接C:\Oracle\11.2\Client_x64
(见下文)
通常更改为文件夹%WINDIR%\ SysWOW64 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
不得在PATH环境中.
如果需要,将yor ORACLE_HOME
环境变量设置为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
)
你完成了!现在,您可以将x86和x64 Oracle客户端无缝连接在一起,即x86应用程序将加载x86库,x64应用程序将加载x64库,而无需对系统进行任何进一步修改.
用于创建符号链接的命令:
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
.
如果您想在以后手动安装ODP.NET,请注意选择适当的文件夹进行安装.
尽管其名称文件夹C:\Windows\System32
包含x64库,但C:\Windows\SysWOW64
包含x86(32位)库.不要混淆.
例如,将TNS_ADMIN
环境变量(TNS_ADMIN
在Registry中的resp.条目)设置为公共位置可能是明智的选择TNS_ADMIN=C:\Oracle\Common\network
.
在目标机器上安装ODP.Net,它应该解决问题...复制dll看起来不是一个好主意......
对于Oracle 11g(11.1.0.7.20),我必须添加以下dll以及我的Exe才能工作.
OCI.DLL
OraOps11w.dll
oraociicus11.dll(非常接近30mb)
Oracle.DataAccess.dll
经过数小时的故障排除,我发现此问题是由我的项目bin目录中包含Oracle.DataAccess.dll(v4.0)引起的,但是运行时还从GAC加载了Oracle.DataAccess.dll(v2.x)。删除并阅读项目参考中的Oracle.DataAccess条目对我来说解决了这个问题。
在我看来,这里提到的其他文件似乎不是必需的。
更新“提供程序与Oracle客户端版本不兼容”错误的根本原因是(通常)托管程序集试图加载与版本不匹配的非托管库。似乎可以通过在web.config中指定库路径来强制Oracle驱动程序使用正确的库1