我在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
#1 楼
我一直在进一步研究这个问题,您只需要从ODP.Net的同一下载版本中获取所有适当的DLL,并将它们放在您的Exe文件所在的文件夹中,因为ODP.Net对于不混合使用非常挑剔版本号。我已经在此处说明了如何执行此操作:http://splinter.com.au/using-the-new-odpnet-to-access-oracle-from-c
这是它的要旨:
下载ODP.Net
解压缩文件
解压缩其中的所有JAR
获取这些dll只是解压缩了:
Oracle.DataAccess.dll
oraociicus11.dll
OraOps11w.dll
orannzsbb11.dll
将所有与C#可执行文件在同一文件夹中的DLL
#2 楼
对于初学者,您应该“忽略”所有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的引用
确保两个dll均已发布您的exe(在VS2010中添加到应用程序文件夹中)
评论
好消息是Oracle终于有了一个完全托管的驱动程序。拖延那个100mb的dll实在是一个负担。
–贾芬(Jafin)
13年7月24日在6:12
托管驱动程序对我来说很棒-自从移至该驱动程序以来没有任何问题/您可以将项目设置回AnyCPU等,并且效果很好:)
– Tod Thomson
13年11月28日在5:58
只是每个人都知道,尽管Managed提供程序很好,但它缺少完整提供程序允许的许多功能。即,Oracle的内置加密。
–贾斯汀·斯基尔斯(Justin Skiles)
2014年3月28日19:01
至少可以说,Oracle的文档往往“分散”。这是一些不受支持的方法的良好链接。此外,驱动程序本身附带了自述文件,概述了一些限制。
–贾斯汀·斯基尔斯(Justin Skiles)
2014年4月4日在12:45
使用托管驱动程序是最终解决方案!每当我认为类型不匹配时,我都会花费很多时间
– ettore ct
16年4月19日在9:40
#3 楼
我只安装了.NET 2.0的Oracle数据提供程序(11.1.0.6.20),没有安装Oracle Instant Client(11.1.0.6.0)。我刚刚安装它,错误消失了!
评论
您能简单地将4个即时客户端DLL复制到与EXE相同的文件夹中,而不是安装客户端吗? (这些文件:oci.dll orannzsbb11.dll oraocci11.dll oraociicus11.dll)
–克里斯
09年8月11日,0:43
@克里斯:是的,你可以。但是,以我的经验,您需要oci.dll,orannzsbb11.dll,oraociicus11.dll,oraops11w.dll和oracle.dataaccess.dll
–白曼
13年1月14日在21:49
对我来说其他方法-我安装了客户端,但没有安装提供程序
– Ev。
2014年5月30日下午4:26
#4 楼
这可能是由于针对32位Oracle客户端运行64位.NET运行时引起的。如果您的服务器在64位上运行应用程序,则可能会发生这种情况。它将在64位运行时环境下运行.NET应用。您可以在VS中的项目上设置CPU标志,以在32位运行时中运行。评论
刚遇到这个。在一个(32位)测试应用程序中工作,然后在IIS中崩溃。而不是要求所有涉及的程序集都是32位的,我改为使用32位的AppPool。
–anton.burger
2011年7月20日在9:49
#5 楼
让我们做一些总结:错误消息“提供程序与Oracle客户端的版本不兼容”可能是由多种原因引起的。
您没有安装Oracle Client。在这种情况下,错误消息的确会引起误解。
Oracle Instant Client不包含.NET的Oracle数据提供程序(ODP.NET,即文件
Oracle.DataAccess.dll
),它必须单独安装(从32位Oracle数据访问组件(ODAC)下载)或64位Oracle数据访问组件(ODAC)下载),或者您必须在Oracle Universal Installer(OUI)中选择相应选项。 请注意,在安装Oracle Data Provider> = 12.1时,该提供程序不会自动注册到GAC中。如果需要,您必须手动注册它,请参阅Oracle Doc 2272241.1。
ODP.NET的版本与安装的Oracle Client版本不匹配。您甚至必须检查次要版本号!例如,
Oracle.DataAccess.dll
版本4.112.3.0与Oracle Client 11.2.0.4不兼容。仔细检查ODP.NET和Oracle Client的版本。您可以在oraociei*.dll
和/或OraOps*w.dll
上使用sigcheck来获取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有关。在Oracle Client 11.1之前,版本“ 1.x”可用。 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加载的,默认情况下它优先于任何本地提供的文件。解决方案
考虑使用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>
不需要
Version=...
或processorArchitecture=...
之类的属性。您的应用程序将根据所选的体系结构和目标.NET Framework(如果已正确安装)加载正确的Oracle.DataAccess.dll
->未经100%验证的
如果您不知道版本目标计算机(例如,可能是您客户的计算机)上的Oracle Client的安装:转到上面提到的下载页面,并下载Oracle Data Access Components的最低XCopy版本。解压缩zip并将
Oracle.DataAccess.dll
文件仅复制到本地计算机。在VS项目中,请对此DLL(最有可能是过时的)进行引用。该DLL的版本是您的应用程序可以使用的ODP.NET的最低版本。当您运行应用程序时,GAC中的发布商政策将重定向到实际安装的版本。我认为采用单个DLL并将其复制到某些文件夹不是一种明智的方法。它可能在“裸机”上运行,但是如果目标计算机已安装任何Oracle产品,则版本失配的风险很高。从计算机上卸载所有Oracle产品,然后进行全新安装。看一下如何卸载/完全删除Oracle 11g(客户端)?以便获得真正干净的计算机。
如果必须同时使用32位和64位应用程序,请按照以下说明在一个计算机上安装两个版本:
假设: Oracle Home称为
OraClient11g_home1
,客户端版本为11gR2。可选地删除所有已安装的Oracle客户端
下载并安装Oracle x86客户端,例如到
C:\Oracle.2\Client_x86
中下载并将Oracle x64 Client安装到其他文件夹中,例如安装到
C:\Oracle.2\Client_x64
打开命令行工具,转到文件夹%WINDIR%\ System32(通常为
C:\Windows\System32
),并创建到文件夹ora112
的符号链接C:\Oracle.2\Client_x64
(请参见下文)更改到文件夹%WINDIR%\ SysWOW64(通常是
C:\Windows\SysWOW64
)并创建到文件夹ora112
的符号链接C:\Oracle.2\Client_x86
(请参见下文)修改
PATH
环境变量,将C:\Oracle.2\Client_x86
和C:\Oracle.2\Client_x64
之类的所有条目替换为C:\Windows\System32\ora112
,分别是其\bin
子文件夹。注意:C:\Windows\SysWOW64\ora112
一定不能在PATH环境中。如果需要,请将
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.2\Client_x64
cd C:\Windows\SysWOW64
mklink /d ora112 C:\Oracle.2\Client_x86
一些注意事项:
两个符号链接必须具有相同的名称,例如
ora112
。 如果以后要手动安装ODP.NET,请注意选择合适的文件夹进行安装。
尽管它们的名称文件夹
C:\Windows\System32
包含x64库,而C:\Windows\SysWOW64
包含x86(32位)库。请勿混淆。将
TNS_ADMIN
环境变量(注册表中的TNS_ADMIN
条目)设置为公共位置,例如TNS_ADMIN=C:\Oracle\Common\network
,也许是一个明智的选择。评论
与实际答案相比,此IMO具有更多的知识要带走。因此,如果我有一个适用于.net 4的x86应用程序,并且数据库版本为9i,那么如果用户使用32位或64位Windows,则需要具有什么客户端版本? Oracle说任何客户端版本都与任何数据库版本兼容。 32位用户的答案是否安装了32位版本,而64位用户安装了64位版本并使用ODP.NET托管驱动程序来确定与哪个OS进行通讯?
–夜光
2014-12-12 15:28
使用ODP.NET托管驱动程序时,不需要安装任何Oracle客户端-这是它的主要优点。它可以与x86和x64应用程序一起使用。如果没有“ ODP.NET托管驱动程序”,则无论数据库服务器体系结构是什么,x86应用程序也都需要x86(即32位)Oracle Client。
– Wernfried Domscheit
2014年12月12日21:40在
我刚遇到“需要安装Microsoft Visual C ++ 2010可再发行组件”的问题,您应该将其添加到摘要中。
–杰伊·沙利文(Jay Sullivan)
2015年2月5日在21:10
我不认为此错误与Oracle或ODP.NET相关或由其引起的
– Wernfried Domscheit
2015年2月5日在21:29
它对我有用,我从nuget软件包Oracle.DataAccess.x86安装Oracle.DataAccess.dll,其Dll版本为2.112.1.0,因此我将安装Oracle Client与版本Oracle Database 11g Release 2 Client(11.2.0.1.0)匹配。 )(适用于Microsoft Windows(x64)),然后问题解决了!
–于阳健
19年5月30日在4:49
#6 楼
经过数小时的故障排除后,我发现此问题是由我的项目bin目录中包含Oracle.DataAccess.dll(v4.0)引起的,但是运行时还从GAC加载了Oracle.DataAccess.dll(v2.x)。删除并读取项目参考中的Oracle.DataAccess条目对我来说解决了这个问题。此处提到的其他文件在我的情况下似乎不是必需的。
UPDATE
“提供程序与Oracle客户端版本不兼容”错误的根本原因是(通常)托管程序集试图加载与版本不匹配的非托管库。似乎可以通过在web.config1中指定库路径来强制Oracle驱动程序使用正确的库。
<configuration>
<oracle.dataaccess.client>
<settings>
<add name="DllPath" value="C:\oracle\bin"/>
<!-- ... -->
</settings>
</oracle.dataaccess.client>
</configuration>
评论
谢谢!您的解决方案使我想到可以在两天后工作(我有Visual Studio 2010 Net 4,Oracle 10g客户端)...我看到了GAC,当然我已经安装了3个版本的Oracle.DataAccess.dll,我都没搞错(和删除“ DbProviderFactories”中无效的machine.config项),然后仅重新安装ODAC1120320 x64。而且有效。
–埃尔纳多·冈萨雷斯(Hernaldo Gonzalez)
2014年8月11日15:30
#7 楼
在目标计算机上安装ODP.Net,它应该可以解决问题...复制dll看起来不是一个好主意...#8 楼
对于Oracle 11g(11.1.0.7.20),我必须将以下dll与我的Exe一起添加才能使用。OraOps11w.dll
oraociicus11.dll(相当大,接近30mb)
Oracle.DataAccess.dll
评论
您想说130 MB
– Elmue
17年4月19日在22:41
#9 楼
在我看来,尽管您的Oracle Istant Client具有ODP,但ODP可能正尝试使用实际的Oracle Client。您是否还在计算机上安装了标准的Oracle客户端?我记得甲骨文对同一台计算机上的多个客户端非常谨慎。#10 楼
我有同样的问题。编译应用程序后,我删除了(并忘记删除了)oraociei11.dll。并且它在尝试执行时给出了此错误。因此,当找不到该oraociei11.dll的dll时,它将显示此错误。可能还会有其他情况出现此错误,但这似乎是其中一种。#11 楼
还要查找IIS应用程序池启用32位true或false标志,当您看到此消息时,一些oracle论坛为此指导了我!#12 楼
我有同样的问题,但就我而言,我不能仅将dll复制到bin文件夹中,然后我只能“重新绑定”程序集版本。<?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>
#13 楼
这是我为解决此问题持续3个小时而采取的措施:在位于
C:\oracle\product.2.0
的Oracle主目录下,我有一个名为client_1
的文件夹,以前在其中为Windows 64位安装ODP.NET
位。后来尝试用Visual Studio 2012调试ASP.NET Web API应用程序时,我一直收到以下错误消息:提供程序与Oracle客户端的版本不兼容。
搜索Google我发现发生这种情况是因为我使用的是
ODP.NET
64位。然后我抓住了Windows 32位的ODP.NET
并安装了它,但是我仍然收到相同的错误消息。解决方案:删除了文件夹
client_1
并重新安装了ODP.NET
32位。安装程序在某种程度上将64位版本的比特与32位版本的比特混合在一起。走吧... 现在我又很高兴,我可以打开一个新的
OracleConnection
。最后! :) #14 楼
对于仍然存在此问题的任何人:根据本文http://oradim.blogspot.com/2009/09/odpnet-provider-is-not-compatible-with.html
我发现我的服务器缺少Microsoft C ++ Visual Runtime库-由于安装了Visual Studio,因此在我的开发机上安装了它。我从此处下载并安装了(当前)该库的最新版本:
http://www.microsoft.com/zh-cn/download/details.aspx?id=13523
运行安装程序,并使用C#进行oracle调用!
评论
Dude .... Oracle ....我们可以谈一点吗?来到这里,在角落里。听着,伙计,我花了整整一天的时间弄清楚“供应商不兼容”到底是什么意思,后来才发现这是因为未满足某些安装依赖性。请-否-我要求您让安装程序在安装时检查这些依赖项,并在未满足要求时警告用户。谢谢。
–杰伊·沙利文(Jay Sullivan)
2015年2月5日在21:08
顺便说一句,我不得不多次回到这个stackoverflow问题,并且每次都会有一个不同的答案适用于我。这造成了时间和金钱的浪费。
–杰伊·沙利文(Jay Sullivan)
2015年2月5日在21:09
#15 楼
TLDR版本:改用12c 100%托管提供程序。
如果必须使用旧提供程序,则需要将Oracle.DataAccess.dll指向非托管Oracle客户端。具有正确版本的Dll。如果您的计算机上安装了多个Oracle Client,那么可能很简单,例如在应用程序配置中包含“ DllPath”配置变量(请参见下文),但是您可能还需要安装一个新的Oracle客户端以指向。
完整版:
首先,请确保我们了解旧的未付费提供商(而不是新的12c 100%托管提供商)的组件。它由两部分组成:
托管.net组件-Oracle.DataAccess.dll
非托管(非.net)客户端
简而言之,Oracle.DataAccess.dll几乎只是一个包装,将.net指令转换为针对非托管客户端的ORACLE-NET指令。在其中尝试查找所需的非托管客户端dll。从Oracle文档:
Oracle.DataAccess.dll根据以下顺序搜索依赖的非托管DLL(例如Oracle Client的
):
1.应用程序或可执行文件的目录。
2.由应用程序config或web.config指定的DllPath设置。
3.由machine.config指定的DllPath设置。
4. Windows注册表指定的DllPath设置。
HKEY_LOCAL_MACHINE \ Software \ Oracle \ ODP.NET \ version \ DllPath
5.Directory
因此,在您的情况下,您的应用程序遵循上述过程,并找到了一个路径,该路径具有相对于Oracle.DataAccess而言过旧的未管理dll。您正在使用的dll程序集。
可能是该机器上唯一的Oracle Client安装太旧了。但是,如果您在计算机上安装了多个客户端,并且在其他但较旧的安装中首先发现了未管理的文件,则这会起作用。如果是更高版本,那么简单的操作是在配置中使用dllPath配置变量,并将其指向正确的Oracle Home Bin文件夹:
<configuration>
<oracle.dataaccess.client>
<add key="DllPath" value="c:\oracle\product.1.0-xcopy-dep\BIN"/>
</oracle.dataaccess.client>
</configuration>
如果要安装新的客户端副本,xcopy版本最小,并包含“即时客户端”,并将上面的DllPath指向此新位置。但是任何oracle客户端安装都可以使用。
但是,如果要避免所有这些非托管客户端解析问题,请查看是否可以更新您的应用程序以使用100%托管提供程序-确实,这只是一个或两个托管程序集,而不依赖于未管理的文件。
如果装在bin目录和以下目录中的Oracle.DataAccess.dll也可能没有加载您认为的Oracle.DataAccess.dll。您的GAC,但我认为这不太可能。有关更多信息,请参见程序集解析过程。
#16 楼
IIS / IWAM用户是否对Oracle目录具有权限?您可以使用其他应用程序(例如Excel或Access)连接到此数据源吗?#17 楼
我们有同样的问题,因为网络共享上的Oracle.Data.dll程序集是由我们的DBA更新的。从项目中删除引用,然后再次添加即可解决问题。#18 楼
仅需两个步骤即可解决此问题。进行应用程序池的设置并将“启用32位应用程序”标志设置为True。
确保Bin中的所有Dll现在是32位版本...
祝你好运。
评论
@ mazhar-abbas,可以吗?指出可以在哪设置“启用32位应用程序?是在IIS还是Project中?
–hiFI
2014年9月5日下午6:23
#19 楼
我没有走获得新的DLL的道路。我们有很多现有的项目都可以很好地工作,只有我的新项目让我头疼,所以我决定尝试其他方法。我的项目使用的是内部开发的Internal.dll,该文件依赖于Oracle.DataAccess.dll
v4.112.3.0
。由于某些原因,即使在发布时,Visual Studio始终上载v4.121.0.0
,即使未在任何配置文件中明确指定它。这就是为什么我出错了。所以我所做的是:
将Internal.dll从成功运行的项目之一复制到我的网站的
/bin
(为了安全起见)。将Oracle.DataAccess.dll从成功运行的项目之一复制到我的网站的
/bin
中。从我的网站添加对这两个项目的引用。 />最后,Oracle.DataAccess参考出现在
myWebSite.csproj
中,但显示的是错误的版本:v4.121.0.0
而不是v4.112.3.0
。我在
myWebSite.csproj
中手动更改了参考,所以现在显示为:<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>
评论
在bin文件夹中添加对dll的引用是一个非常糟糕的主意。
–杰伊·沙利文(Jay Sullivan)
15年1月26日在17:51
bin和obj文件夹是输出文件夹;这是构建项目时dll的去向。您应该可以随时删除这些文件夹而不会造成冲突。通常,这些文件夹在源代码管理中被忽略。标准做法是创建一个外部引用文件夹,在其中放置引用的dll。
–杰伊·沙利文(Jay Sullivan)
15年1月27日在16:48
@notfed似乎您是对的。会记住这一点。
–Robotron
15年1月28日在7:54
就像命名一样,它只是编译器的提示路径,不是强制引用。首先,在GAC中搜索Oracle.DataAccess.dll。即使您完全删除了HintPath,它也应该起作用。
– Wernfried Domscheit
2015年2月1日在18:15
#20 楼
在安装适用于Visual Studio 2015的Oracle数据工具,然后与Oracle战斗了一个小时之后,我遇到了此问题。我决定再次尝试重新安装Oracle客户端,而不是因为文件复制,配置更改等造成混乱,这对我来说很有效。#21 楼
我遇到了类似的问题,根本原因是GAC具有2个oracle.dataaccess版本,即v4.0_4.112.2.0和v4.0_4.112.4.0。我的应用程序指的是v4.0_4.112.2.0,所以当我从GAC删除v4.0_4.112.4.0时,它可以正常工作。GAC路径:C:\ Windows \ Microsoft.NET \ assembly \ GAC_64 \ Oracle.DataAccess
之前:
之后:
要删除版本,您只需从GAC删除相应的文件夹即可。
#22 楼
如果您有多个oracle客户端,或者使用不同版本的oracle客户端,则在使用非托管oracle引用时可能会发生此问题。有两种解决方法:
第一个快速解决方案是从NuGet中删除非托管引用并使用托管引用,然后再使用此选项。ODP.NET托管驱动程序和非托管驱动程序之间的区别。第二个解决方案是修复项目非托管目标版本,如下所示:
首先检查oracle项目参考版本(从项目参考/(依赖项>程序集)> Oracle.DataAccess右键单击>属性):
然后检查oracle GAC版本
从运行(Win + R)转到gac“%windir %\ Microsoft.NET \ assembly“
检查与您匹配的平台项目平台
检查目标平台(正确点击您的项目>属性)
从gac文件夹搜索到Oracle.DataAccess
右键单击Oracle.DataAccess>属性>详细信息并检查版本
如果您发现版本不同,则这是一个问题,要解决此问题,我们需要重定向程序集版本(在启动项目中转到配置文件并添加以下部分)
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89b483f429c47342" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="4.121.2.0" />
</dependentAssembly>
</assemblyBinding>
像这样
oldVersion:应该掩盖您的项目版本
newVersion:GAC版本
publicKeyToken:来自GAC
#23 楼
最近,我不得不从事一个较旧的项目,该解决方案和所有包含的项目都针对x32平台。我一直尝试在所有位置上复制Oracle.DataAccess.dll和所有其他建议的Oracle文件,但是每次都遇到麻烦。最后,头部的灯泡点亮(8小时后:)),并要求检查是否已安装ODAC组件及其平台。我已经安装了所有64位(x64)ODAC客户端,但没有安装32位(x32)。安装了32位ODAC,问题消失了。如何检查已安装ODAC的版本:在文件夹C:\ Windows \ assembly中查找。 “处理器体系结构”属性将通知平台已安装的ODAC。
灯泡要点亮八小时。难怪我总是不得不在工作中苦苦挣扎:)。
评论
注意,C:\ Windows \ assembly仅显示.NET Framework 2.0之前的程序集。不显示版本3.x / 4.x,请参阅stackoverflow.com/questions/28213105/…
– Wernfried Domscheit
17年12月11日在7:38
#24 楼
克里斯的解决方案也为我工作。但是,我确实收到一条以下错误消息,指出: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位计算机。
只需将Project Properties中的目标平台更改为64位,并希望获得最好的结果。
评论
那实际上是.NETish,而不是Oraclish
–杰伊·沙利文(Jay Sullivan)
14年2月26日在21:01
#25 楼
我在Oracle.DataAccess.dll v4.121.2.0中遇到了相同的问题。与2家庭安装(32和64位版本)。对于32位版本,没有工作的64位版本。在我的情况下(尝试2天后),我发现问题出在64位家庭版的权限上。该版本中的许多目录都具有唯一覆盖的权限,在这些权限中,“经过身份验证的用户”角色没有“读取”访问权限,默认情况下,该访问权限是在父目录上设置的。这些子目录包括“ bin”,“ network / admin”,“ nls”,“ oracore”,“ RDBMS”以及其他。我通过从sysinternals的“进程监视器”(Procmon.exe)实用程序中过滤出“访问拒绝”结果来找到它们。一旦权限从父目录继承到那些子目录,一切便开始起作用。
我没有什么要覆盖整个oracle主目录的权限的,所以我一次只给了它们一个目录,但是我想如果您不担心安全性的话,可以将其重置为整个对应的oracle主目录。
#26 楼
在64位计算机上,将C:\ Windows \ SysWOW64中的“ msvcr71.dll”复制到应用程序的bin目录中。
在32位计算机上,将“ msvcr71.dll”复制到您的应用程序的bin目录中。 “ .dll”从C:\ Windows \ System32复制到应用程序的bin目录。
http://randomdevtips.blogspot.com/2012/06/provider-is-not- compatible-with-version.html
#27 楼
这里有很多理论上的答案,但是这里有一个可以使用的示例,您可以立即复制,粘贴和测试代码:我安装了Oracle Express数据库OracleXE112,该数据库已经预装了一些演示程序表。
启动安装程序时,系统会要求您输入密码。我输入“ xxx”作为密码。 (不在生产环境中使用)
我的服务器在192.168.1.158计算机上运行。在服务器上,您必须明确允许Windows防火墙中的TNSLSNR.exe进程访问。此过程在端口1521上进行侦听。如果从以下代码中收到超时错误,请检查防火墙。
选项A:对于C#(。NET2或.NET4),您可以下载ODAC11,将Oracle.DataAccess.dll添加到您的项目。此外,此DLL取决于:OraOps11w.dll,oci.dll,oraociei11.dll(130MB!),msvcr80.dll。
这些DLL必须与EXE位于同一目录中,或者您必须在
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET.112.4.0\DllPath
中指定DLL路径。在64位计算机上,还要另外写入HKLM\SOFTWARE\Wow6432Node\Oracle\...
。选项B:如果您下载了ODAC12,则需要Oracle.DataAccess.dll,OraOps12w.dll,oci.dll和oraociei12.dll(160MB! ),oraons.dll,msvcr100.dll。注册表路径为HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET.121.2.0\DllPath
选项C:如果您不希望超过100 MB的巨大DLL,则应下载ODP.NET_Managed12.xxxxxxxx.zip,在其中找到
Oracle.ManagedDataAccess.dll
,其中仅4 MB,它是一个纯托管的DLL,它也可以在32位和64位进程中工作,并且不依赖其他DLL,并且不需要任何注册表项。以下C#代码对我有效,无需进行任何配置服务器端(仅为默认安装):
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"]); } } } }
评论
当您只需要一个运行中的客户端时,安装整个Oracle数据库服务器就太过头了。
– Wernfried Domscheit
17年12月11日在7:18
无论如何,你的回答很差。无需将任何Oracle dll复制到应用程序目录,因为默认情况下安装是通过‰PATH%找到它们的(除非您自行修改)。Registy提示仅适用于.version 4.x,仅适用于32位Oracle客户端,但是32位与64位不匹配是此问题的主要主题。
– Wernfried Domscheit
17年12月13日在12:52
您的评论表明您没有阅读我的答案。如果我要编写一个与Oracle服务器通信的应用程序,则无需从Oracle安装任何软件。我只是使用上面提到的DLL,并将其与我的应用程序一起分发。因此,最终用户计算机上的PATH变量中将没有任何内容。顺便说一句,在现代软件中,不建议使用PATH变量(该变量来自1980年的DOS时代)。我的答案建议选项C,它不需要任何注册表路径,并且不依赖于32位或64位。我提到选项A和B仅出于完整性考虑。
– Elmue
17年12月13日在15:31
我认为,如果没有正确设置%PATH%,则Windows根本无法运行-即使在版本10中也是如此。我在回答中提到,手动将任何Oracle dll复制到您的应用程序中并不明智。我不知道这些dll的源代码,但是可能看不到客户侧的更多依赖项,例如由语言设置,字符集,时区等触发。当我使用Oracle.DataAccess.dll进行跟踪时,该程序总共加载了35个Oracle DLL!更好地进行Oracle Client的常规安装-当然,除非使用ODP.NET托管驱动程序。
– Wernfried Domscheit
17年12月13日在15:48
我想我提到了我的担忧:(1)安装数据库是没有用的,即过大。 (2)选项A和B仅在某些条件下有效,例如,它不会从注册表中读取任何NLS设置(为此您需要文件oracle.key)。为了兼容性,您还必须考虑次要版本。例如,Oracle.DataAccess版本= 2.112.2.0不适用于OraOps11w.dll版本2.112.4.0。
– Wernfried Domscheit
17年12月14日在7:26
评论
您的解决方案对我有用-在找到此内容之前先找到您的博客文章。你是男人谢谢! :-)而且,使用最新版本的ODAC,我不需要解压缩任何JAR文件.... dll文件位于我的Oracle主页中的各个目录中。一个简单的Windows搜索很快就打开了它们。
–潘丹库斯
2010-12-28 18:23
另外,我在开发机上使用的是最新版本的ODAC(11.2.0.1.2),仅需要的文件是:oci.dll,Oracle.DataAccess.dll,oraociei11.dll,OraOps11w.dll。克里斯指出,请确保它们在您可以执行的文件夹中。 ;-)
–潘丹库斯
2010-12-28 18:36
听起来较新的版本使查找dll更加容易。大!现在,Oracle将它们滚动到一个简单的dll中需要多长时间...
–克里斯
2011年1月5日,0:57
如果可以的话,这些天您可能应该使用C#托管驱动程序:)
–克里斯
17-10-10在9:55
如果您的客户安装了(正常)Oracle Client,则此解决方案可能会失败,因为GAC中安装了Oracle.DataAccess.dll。在这种情况下,Oracle.DataAccess.dll是从GAC(优先于.exe文件夹)中获取的,而其他DLL是从.exe文件夹中获取的。这可能会导致“版本不兼容”错误。
– Wernfried Domscheit
17年12月14日在13:56