Eve*_*ner 156 c# asp.net oracle odp.net oracleclient
我正在尝试在我的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();
Run Code Online (Sandbox Code Playgroud)
页面的错误如下所示:
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
Run Code Online (Sandbox Code Playgroud)
Chr*_*ris 90
我一直在研究这个问题,你只需要从相同的下载版本的ODP.Net中获取所有相应的DLL,并将它们放在与Exe文件相同的文件夹中,因为ODP.Net对于不混合而言非常挑剔版本号.
我在这里解释了如何做到这一点:http://splinter.com.au/using-the-new-odpnet-to-access-oracle-from-c 以下是它的要点:
Tod*_*son 45
您应该为启动器"忽略"所有x86/x64对话,而是尝试使用ODP.NET托管驱动程序(如果您使用的是.Net v4 +):
https://www.nuget.org/packages/Oracle.ManagedDataAccess/
https://www.nuget.org/packages/Oracle.ManagedDataAccess.EntityFramework/
避免所有"非托管"DLL什么架构问题!:D(约时间Oracle).
NuGet包(也适用于11g):
旧/手动方法:
有关如何转换为使用托管库的信息:
Eve*_*ner 35
我只安装了用于.NET 2.0的Oracle数据提供程序(11.1.0.6.20),但我没有安装Oracle Instant Client(11.1.0.6.0).
我刚安装它,错误消失了!
Dan*_*iel 32
这可能是由针对32位Oracle客户端运行64位.NET运行时引起的.如果您的服务器在64位上运行应用程序,则会发生这种情况.它将运行64位运行时的.NET应用程序.您可以在VS中的项目上设置CPU标志,以便在32位运行时中运行.
Wer*_*eit 22
让我们做一些总结:
错误消息"提供程序与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
在开发机器上(即这是在编译时加载的版本)比目标机上的版本更高.
解决方案
考虑使用ODP.NET托管驱动程序,它可以从Oracle页面下载:64位Oracle数据访问组件(ODAC)下载.在那里你只需要将Oracle.ManagedDataAccess.dll
文件复制到你的应用程序目录,不需要其他任何东西.它适用于32位和64位.
在你的*.csproj
,相应的.*.vbproj
编辑您对ODP.NET的引用,如下所示:
<Reference Include="Oracle.DataAccess">
<SpecificVersion>False</SpecificVersion>
<Private>False</Private>
</Reference>
Run Code Online (Sandbox Code Playgroud)
属性喜欢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
Run Code Online (Sandbox Code Playgroud)
一些说明:
两个符号链接必须具有相同的名称,例如ora112
.
如果您想在以后手动安装ODP.NET,请注意选择适当的文件夹进行安装.
尽管其名称文件夹C:\Windows\System32
包含x64库,但C:\Windows\SysWOW64
包含x86(32位)库.不要混淆.
例如,将TNS_ADMIN
环境变量(TNS_ADMIN
在Registry中的resp.条目)设置为公共位置可能是明智的选择TNS_ADMIN=C:\Oracle\Common\network
.
对于Oracle 11g(11.1.0.7.20),我必须添加以下dll以及我的Exe才能工作.
经过数小时的故障排除,我发现此问题是由我的项目bin目录中包含Oracle.DataAccess.dll(v4.0)引起的,但是运行时还从GAC加载了Oracle.DataAccess.dll(v2.x)。删除并阅读项目参考中的Oracle.DataAccess条目对我来说解决了这个问题。
在我看来,这里提到的其他文件似乎不是必需的。
“提供程序与Oracle客户端版本不兼容”错误的根本原因是(通常)托管程序集试图加载与版本不匹配的非托管库。似乎可以通过在web.config中指定库路径来强制Oracle驱动程序使用正确的库1
<configuration>
<oracle.dataaccess.client>
<settings>
<add name="DllPath" value="C:\oracle\bin"/>
<!-- ... -->
</settings>
</oracle.dataaccess.client>
</configuration>
Run Code Online (Sandbox Code Playgroud)