我试图在ASP.net项目上使用Oracle ODP.NET 11g(11.1.0.6.20)Instant Client作为数据提供程序,但是当我运行aspx页面时,出现“提供程序与版本不兼容客户端”错误消息。任何帮助将不胜感激。

我在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


评论


您的解决方案对我有用-在找到此内容之前先找到您的博客文章。你是男人谢谢! :-)而且,使用最新版本的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

#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_x86C:\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