提供程序与Oracle客户端的版本不兼容


157

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

Answers:


91

我一直在进一步研究这个问题,您只需要从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#可执行文件放在同一文件夹中

4
您的解决方案对我有用-在找到此内容之前先找到您的博客文章。你是男人 谢谢!:-)而且,使用最新版本的ODAC,我不需要解压缩任何JAR文件.... dll文件位于我的Oracle主页中的各个目录中。一个简单的Windows搜索很快就打开了它们。
Pandincus 2010年

10
另外,我在开发机上使用的是ODAC的最新版本(11.2.0.1.2),唯一需要的文件是:oci.dll,Oracle.DataAccess.dll,oraociei11.dll,OraOps11w.dll。克里斯指出,请确保它们在您可以执行的文件夹中。;-)
Pandincus 2010年

1
听起来较新的版本使查找dll更加容易。大!现在,甲骨文将它们滚动到一个简单的dll中需要多长时间...
Chris

Chris的策略和Pandincus的资料库为我工作。我通过PowerShell调用oracle客户端,因此将库集放置在PowerShell可执行目录中。
quillbreaker 2011年

1
如果可能的话,这些天您可能应该使用C#托管驱动程序:)
克里斯(Chris

47

对于初学者,您应该“忽略”所有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中的“ 应用程序文件夹”中)

3
好消息是Oracle终于有了一个完全托管的驱动程序。拖延那个100mb的dll是一个真正的负担。
Jafin

1
托管驱动程序对我来说很棒-自从移到该驱动程序以来没有任何问题/您可以将您的项目设置回AnyCPU等,而且效果很好:)
Tod Thomson

5
所有人都知道,尽管Managed提供程序很好,但它缺少完整提供程序允许的许多功能。即,Oracle的内置加密。
贾斯汀·斯基尔斯

1
至少可以说,Oracle的文档往往“分散”。这是一些不受支持的方法的良好链接。此外,驱动程序本身带有readme概述了一些限制的。
贾斯汀·斯基尔斯

2
使用托管驱动程序是最终解决方案!每当我认为类型不匹配时,我都会花费很多时间
ettore ct

35

我只安装了.NET 2.0Oracle数据提供程序(11.1.0.6.20),没有安装Oracle Instant Client(11.1.0.6.0)

我刚安装它,错误消失了!


3
您能简单地将4个即时客户端DLL复制到与EXE相同的文件夹中,而不是安装客户端吗?(这些文件:oci.dll orannzsbb11.dll oraocci11.dll oraociicus11.dll)
克里斯,克里斯,2009年

2
@克里斯:是的,可以。但是,以我的经验,您需要oci.dll,orannzsbb11.dll,oraociicus11.dll,oraaops11w.dll和oracle.dataaccess.dll
Pakman 2013年

对我来说,其他方法-我安装了客户端,但没有安装提供程序
Ev。

33

这可能是由于针对32位Oracle客户端运行64位.NET运行时引起的。如果您的服务器在64位服务器上运行应用程序,则可能会发生这种情况。它将在64位运行时环境下运行.NET应用。您可以在VS中的项目上设置CPU标志,以在32位运行时中运行。


刚遇到这个。在一个(32位)测试应用程序中工作,然后在IIS中崩溃。我并不需要所有涉及的程序集都是32位,而是改为使用32位AppPool。
anton.burger 2011年

22

让我们做一些总结:

错误消息“提供程序与Oracle客户端版本不兼容”可能是由于多种原因引起的。

  • 您没有安装Oracle Client。在这种情况下,错误消息的确会引起误解。

    Oracle Oracle.DataAccess.dllInstant Client不包括用于.NET的Oracle数据提供程序(ODP.NET,即file ),它必须单独安装(从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的版本。您可以在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有关。在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加载的,GAC优先于任何本地提供的文件。

解决方案

  • 考虑使用ODP.NET托管驱动程序,可以从Oracle页面下载:64位Oracle Data Access Components(ODAC)下载。在那里,您只需要将Oracle.ManagedDataAccess.dll文件复制到您的应用程序目录,则不需要任何其他操作。它适用于32位和64位。

  • 在您的中*.csproj,分别。*.vbproj像这样编辑对ODP.NET的引用:

    <Reference Include="Oracle.DataAccess">
      <SpecificVersion>False</SpecificVersion>
      <Private>False</Private>
    </Reference>

    诸如Version=...processorArchitecture=...不要求的属性。您的应用程序将Oracle.DataAccess.dll根据所选的体系结构和目标.NET Framework 加载正确的信息(前提是已正确安装) ->未进行100%验证

  • 如果您不知道目标计算机(例如,它可能是您的客户的计算机)上的Oracle Client版本:请转至上述下载页面,并下载Oracle Data Access Components 的最低XCopy版本。解压缩压缩Oracle.DataAccess.dll文件,然后仅将文件复制到本地计算机。在VS项目中,请对此DLL(最有可能是过时的)进行引用。该DLL的版本是您的应用程序可以使用的ODP.NET的最低版本。当您运行应用程序时,GAC中的发布商政策将重定向到实际安装的版本。

  • 我认为采用单个DLL并将其复制到某些文件夹不是一种明智的方法。它可能在“裸机”上运行,但如果目标计算机已安装任何Oracle产品,则版本失配的风险很高。从计算机上卸载所有Oracle产品,然后进行全新安装。看一下如何卸载/完全删除Oracle 11g(客户端)?为了得到一台真正干净的机器。

  • 如果必须同时使用32位和64位应用程序,请按照以下说明在一个计算机上安装这两个版本:

假设:Oracle Home名为OraClient11g_home1,客户端版本为11gR2。

  • (可选)删除所有已安装的Oracle客户端

  • 下载并安装Oracle x86 Client,例如到 C:\Oracle\11.2\Client_x86

  • 将Oracle x64客户端下载并安装到其他文件夹中,例如 C:\Oracle\11.2\Client_x64

  • 打开命令行工具,通常转到文件夹%WINDIR%\ System32,C:\Windows\System32并创建指向ora112文件夹的符号链接C:\Oracle\11.2\Client_x64(请参见下文)

  • 通常C:\Windows\SysWOW64,更改为文件夹%WINDIR%\ SysWOW64 并创建指向ora112文件夹的符号链接C:\Oracle\11.2\Client_x86(请参见下文)

  • 修改PATH环境变量,将所有条目(如C:\Oracle\11.2\Client_x86和)替换C:\Oracle\11.2\Client_x64C:\Windows\System32\ora112,并分别替换其\bin子文件夹。注意:C:\Windows\SysWOW64\ora112不能在PATH环境中。

  • 如果需要,将您的ORACLE_HOME环境变量设置为C:\Windows\System32\ora112

  • 打开注册表编辑器。将注册表值设置HKLM\Software\ORACLE\KEY_OraClient11g_home1\ORACLE_HOMEC:\Windows\System32\ora112

  • 将注册表值设置HKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOMEC:\Windows\System32\ora112(not 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注册表中的注册表项)设置为一个公共位置也许是一个明智的选择TNS_ADMIN=C:\Oracle\Common\network


与实际答案相比,此IMO具有更多的知识要带走。因此,如果我有一个适用于.net 4的x86应用程序,并且数据库版本为9i,那么如果用户使用32位或64位Windows,则需要具有什么客户端版本?Oracle说任何客户端版本都与任何数据库版本兼容。32位用户的答案是否安装了32位版本,而64位用户安装了64位版本并使用ODP.NET托管驱动程序来确定与哪个OS进行通讯?
发光的2014年

1
使用ODP.NET托管驱动程序时,不需要安装任何Oracle客户端-这是它的主要优点。它可以与x86和x64应用程序一起使用。如果没有“ ODP.NET托管驱动程序”,则无论数据库服务器体系结构是什么,x86应用程序也都需要x86(即32位)Oracle客户端。
Wernfried Domscheit 2014年

我刚遇到“需要安装Microsoft Visual C ++ 2010可再发行组件”的问题,您应该将其添加到摘要中。
杰伊·沙利文

1
我认为此错误与Oracle或ODP.NET不相关,也不是由Oracle或ODP.NET引起的
Wernfried Domscheit 2015年

它对我Oracle.DataAccess.dll有用,我从nuget软件包安装Oracle.DataAccess.x86,其Dll版本为2.112.1.0,因此我将Oracle Client与版本Oracle Database 11g Release 2 Client (11.2.0.1.0) for Microsoft Windows (x64) HERE匹配, 然后问题解决了!
洋健

6

经过数小时的故障排除后,我发现此问题是由我的项目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>

谢谢!您的解决方案使我想到可以在两天后工作(我有Visual Studio 2010 Net 4,Oracle 10g客户端)...我看到了GAC,当然我已经安装了3个版本的Oracle.DataAccess.dll,我都没搞错(和删除“ DbProviderFactories”中无效的machine.config项),然后仅重新安装ODAC1120320 x64。而且有效。
Hernaldo Gonzalez 2014年

5

在目标计算机上安装ODP.Net,它应该可以解决问题。复制dll并不是一个好主意。


5

对于Oracle 11g(11.1.0.7.20),我必须将以下dll与我的Exe一起添加才能工作。

  1. oci.dll
  2. OraOps11w.dll
  3. oraociicus11.dll(相当大,接近30mb)
  4. Oracle.DataAccess.dll

您想说130 MB
Elmue '17

2

在我看来,尽管您的Oracle Istant Client具有ODP,但ODP可能正尝试使用实际的Oracle Client。您是否还在计算机上安装了标准的Oracle客户端?我记得甲骨文对于同一台计算机上的多个客户端非常挑剔。


2

我有同样的问题。编译应用程序后,我删除了(并忘记删除了)oraociei11.dll。并且它在尝试执行时给出了此错误。因此,当找不到该oraociei11.dll的dll时,它将显示此错误。可能还会有其他情况出现此错误,但这似乎是其中一种。


2

还要查找IIS应用程序池启用32位true或false标志,当您看到此消息时,一些oracle论坛为此指示了我!


2

我有同样的问题,但就我而言,我不能仅将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>

2

这是我为解决此问题持续3个小时而采取的措施:

  1. 在Oracle主C:\oracle\product\11.2.0目录下,我有一个名为的文件夹client_1,以前在其中ODP.NET为Windows 64位安装了位。

  2. 稍后,当尝试使用Visual Studio 2012调试ASP.NET Web API应用程序时,我一直收到以下错误消息:提供程序与Oracle客户端的版本不兼容

  3. 搜索谷歌,我发现这是因为我使用的是ODP.NET64位。然后,我抓住ODP.NET了Windows 32位并安装了它,但我一直收到相同的错误消息。

  4. 解决方案:删除文件夹client_1并重新安装ODP.NET32位。安装程序在某种程度上将64位版本的比特与32位版本的比特混合在一起。去搞清楚...

  5. 现在我又高兴了,我可以打开一个新的OracleConnection。最后!:)


2

对于仍然有此问题的任何人:根据本文

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调用!


1
Dude .... Oracle ....我们可以谈一点吗?来到这里,在角落里。听着,伙计,我花了整整一天的时间弄清楚“供应商不兼容”到底是什么意思,后来才发现这是因为未满足某些安装依赖性。请-否-我要求您让安装程序在安装时检查这些依赖项,并未满足要求时警告用户。谢谢。
杰伊·沙利文

3
顺便说一句,我不得不多次回到这个stackoverflow问题,并且每次都会有一个不同的答案适用于我。这造成了时间和金钱的浪费。
杰伊·沙利文

2

TLDR版本:

  • 请改用12c 100%托管提供商
  • 如果必须使用旧的提供程序,则需要将Oracle.DataAccess.dll指向具有正确版本的非托管Oracle客户端Dll。如果您的计算机上安装了多个Oracle Client,那么可能很简单,例如在应用程序配置中包含“ DllPath”配置变量(请参见下文),但是您可能还需要安装一个新的Oracle客户端来指向。

完整版本:

首先,请确保我们了解旧的未付费提供商(而不是新的12c 100%托管提供商)的组成部分。它由两部分组成:

  1. 托管.net组件-Oracle.DataAccess.dll
  2. 非托管(非.net)客户端

简而言之,Oracle.DataAccess.dll几乎只是一个包装,将.net指令转换为非托管客户端的ORACLE-NET指令。

就是说,在加载Oracle.DataAccess时,会按照顺序尝试查找所需的非托管客户端dll。从Oracle文档中

Oracle.DataAccess.dll根据以下顺序搜索相关的非托管DLL(例如Oracle Client):

1.应用程序或可执行文件的目录。

2.DllPath设置由应用程序config或web.config指定。

3. machine.config指定的DllPath设置。

4. Windows注册表指定的DllPath设置。

HKEY_LOCAL_MACHINE \ Software \ Oracle \ ODP.NET \ version \ DllPath

5. Windows PATH环境变量指定的目录。

因此,在您的情况下,您的应用程序遵循上面的此过程,并找到了一个路径,该路径具有相对于正在使用的Oracle.DataAccess.dll程序集而言过旧的未管理的dll。

可能是该机器上唯一的Oracle Client安装太旧了。但是,如果您在计算机上安装了多个客户端,并且在其他但较旧的安装中首先发现了未管理的文件,则这会起作用。如果是更高版本,那么简单的事情是在配置中使用dllPath配置变量,并将其指向正确的Oracle Home Bin文件夹:

<configuration>
  <oracle.dataaccess.client> 
    <add key="DllPath" value="c:\oracle\product\1.1.0-xcopy-dep\BIN"/>
  </oracle.dataaccess.client>
</configuration>

如果要安装客户端的全新副本,则xcopy版本是最小的,并且包含“即时客户端”,并将上面的DllPath指向此新位置。但是任何oracle客户端安装都可以。

但是,如果您想避免所有这些不受托管的客户端解析问题,请查看是否可以更新您的应用程序以使用100%托管的提供程序-实际上,它只是一个或两个托管程序集,而无需依赖未托管文件。

如果您同时在bin目录和GAC中都安装了Oracle.DataAccess.dll,也可能没有加载它,但我认为这是不太可能的。有关更多信息,请参见程序集解析过程


1

IIS / IWAM用户是否对Oracle目录具有权限?您可以使用其他应用程序(例如Excel或Access)连接到此数据源吗?


1

我们有同样的问题,因为网络共享上的Oracle.Data.dll程序集是由我们的DBA更新的。从项目中删除引用,然后再次添加它解决了该问题。


1

仅需两个步骤即可解决此问题。

  1. 转到预先设置应用程序池,并将“启用32位应用程序”标志设置为True。
  2. 确保您Bin中的所有Dll现在都是32位版本...

祝你好运。


@ mazhar-abbas,可以吗?指出可以在哪设置“启用32位应用程序?是在IIS还是Project中?
hiFI 2014年

1

我没有走获得新的DLL的道路。我们有很多现有的项目都可以很好地工作,只有我的新项目让我头疼,所以我决定尝试其他事情。

我的项目使用的是内部开发的Internal.dll,它依赖于Oracle.DataAccess.dll v4.112.3.0。由于某些原因,v4.121.0.0即使在发布时,Visual Studio始终上载,即使未在任何配置文件中明确指定它也是如此。这就是为什么我出错了。

所以我做的是:

  1. 从成功运行的项目之一复制Internal.dll到我的网站/bin(只是为了安全起见)。
  2. 将Oracle.DataAccess.dll从成功运行的项目之一复制到我的网站/bin
  3. 从我的网站添加对它们两个的引用。
  4. 最后,在中显示了Oracle.DataAccess参考myWebSite.csproj,但显示了错误的版本:v4.121.0.0而不是v4.112.3.0
  5. 我在中手动更改了引用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> 

2
在bin文件夹中添加对dll的引用是一个非常糟糕的主意。
杰伊·沙利文

1
binobj文件夹是输出文件夹; 这是构建项目时dll的去向。您应该可以随时删除这些文件夹而不会造成冲突。通常,这些文件夹在源代码管理中被忽略。标准做法是创建一个External References文件夹,在其中放置引用的dll。
杰伊·沙利文

@notfed似乎您是对的。会记住这一点。
Robotron

就像命名一样,它只是编译器的提示路径,不是强制引用。首先,在GAC中搜索Oracle.DataAccess.dll。即使您HintPath完全删除它,它也应该起作用。
Wernfried Domscheit,2015年

1

在安装适用于Visual Studio 2015的Oracle数据工具,然后与Oracle战斗了一个小时之后,我遇到了此问题。我决定尝试重新安装Oracle客户端,而不是因为文件复制,配置更改等导致混乱,这对我有用。


1

我遇到了类似的问题,根本原因是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删除相应的文件夹即可。


0

最近,我不得不从事一个较旧的项目,该解决方案和所有包含的项目都针对x32平台。我一直试图在所有地方复制Oracle.DataAccess.dll和所有其他建议的Oracle文件,但是每次都遇到麻烦。最后,头部的灯泡点亮(8小时后:)),并要求检查是否已安装ODAC组件及其平台。我已经安装了所有64位(x64)ODAC客户端,但没有安装32位(x32)。安装了32位ODAC,问题消失了。

如何检查已安装的ODAC的版本:在文件夹C:\ Windows \ assembly中查找。“处理器体系结构”属性将通知平台已安装的ODAC。

灯泡点亮需要八个小时。难怪我总是不得不在工作中苦苦挣扎:)。


注意,C:\Windows\assemblies仅显示了.NET Framework 2.0之前的程序集。版本3.x / 4.x中不显示,看stackoverflow.com/questions/28213105/...
Wernfried Domscheit

0

克里斯的解决方案也为我工作。但是,我确实收到一条以下错误消息,指出:

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位,并希望达到最佳效果。


3
那实际上是.NETish,而不是Oraclish
Jay Sullivan

0

我在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主目录上重置它。



-3

这里有很多理论上的答案,但是这里有一个有效的示例,您可以立即复制,粘贴和测试代码:

  1. 我安装了Oracle Express数据库OracleXE112,该数据库已经预装了一些演示表。
  2. 启动安装程序时,系统会要求您输入密码。我输入“ xxx”作为密码。(不用于生产)
  3. 我的服务器在机器192.168.1.158上运行
  4. 在服务器上,您必须明确允许Windows 防火墙中的进程TNSLSNR.exe的访问。此过程在端口1521上进行侦听。如果从以下代码中收到超时错误,请检查防火墙。
  5. 选项A:对于C#(。NET2或.NET4),您可以下载ODAC11,从中必须将Oracle.DataAccess.dll添加到您的项目中。此外,此DLL取决于:OraOps11w.dll,oci.dll,oraociei11.dll(130MB!),msvcr80.dll。这些DLL必须与EXE位于同一目录中,或者您必须在以下位置指定DLL路径:HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath。在64位计算机上,另外写入HKLM\SOFTWARE\Wow6432Node\Oracle\...
  6. 选项B:如果您下载了ODAC12,则需要Oracle.DataAccess.dll,OraOps12w.dll,oci.dll,oraociei12.dll(160MB!),oraons.dll,msvcr100.dll。注册表路径是HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
  7. 选项C:如果您不希望超过100 MB的巨大DLL,则应下载ODP.NET_Managed12.xxxxxxxx.zip,该文件中的ODP.NET_Managed12.xxxxxxxx.zip Oracle.ManagedDataAccess.dll只有4 MB,并且是可在32位和64位进程中运行的纯托管DLL。同样,它不依赖其他DLL,并且不需要任何注册表项。
  8. 以下C#代码对我有用,无需在服务器端进行任何配置(仅是默认安装):
使用Oracle.DataAccess.Client;
要么
使用Oracle.ManagedDataAccess.Client;

....

字符串oradb =“数据源=(DESCRIPTION =”
    +“(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 192.168.1.158)(PORT = 1521)))”
    +“(CONNECT_DATA =(SERVER = DEDICATED)));”
    +“用户ID = SYSTEM;密码= xxx;”;

使用(OracleConnection conn =新的OracleConnection(oradb)) 
{
    conn.Open();
    使用(OracleCommand cmd = new OracleCommand())
    {
        cmd.Connection = conn;
        cmd.CommandText =“从DBA_DATA_FILES中选择TABLESPACE_NAME”;

        使用(OracleDataReader dr = cmd.ExecuteReader())
        {
            而(dr.Read())
            {
                listBox.Items.Add(dr [“ TABLESPACE_NAME”]);
            }
        }
    }
}

当您只需要一个运行中的客户端时,安装整个Oracle数据库服务器就太过头了。
Wernfried Domscheit,2017年

无论如何,你的回答很差。无需将任何Oracle dll复制到应用程序目录,因为在默认安装下,您可以通过‰PATH%找到它们(除非您自行修改)。Registy提示仅适用于.version 4.x,仅适用于32位Oracle客户端,但是32位与64位不匹配是该问题的主要问题
Wernfried Domscheit

您的评论表明您没有阅读我的答案。如果我要编写一个与Oracle服务器通信的应用程序,则无需从Oracle安装任何软件。我只是使用上面提到的DLL并将其分发到我的应用程序中。因此,最终用户计算机上的PATH变量中将没有任何内容。顺便说一下,在现代软件中,不建议使用PATH变量(该变量来自1980年的DOS时代)。我的答案建议选项C,它不需要任何注册表路径,并且不依赖于32位或64位。我提到选项A和B仅出于完整性考虑。
Elmue

我认为,如果没有正确设置%PATH%,则Windows根本无法运行-即使在版本10中也是如此。我在回答中提到,手动将任何Oracle dll复制到您的应用程序并不明智。我不知道这些dll的源代码,但是当我做一个跟踪与有可能是在您的客户端更多的依赖关系,你看不出来,例如,通过语言设置,字符集,时区等引发Oracle.DataAccess.dll那么程序总共加载了35个Oracle DLL!更好地进行Oracle Client的常规安装-当然,除非使用ODP.NET托管驱动程序。
Wernfried Domscheit

1
我想我提到了我的担忧:(1)安装数据库是没有用的,即过大。(2)选项A和B仅在某些条件下有效,例如,它不会从注册表中读取任何NLS设置(您需要为此文件oracle.key)。为了兼容性,您还必须考虑次要版本。例如Oracle.DataAccess, Version=2.112.2.0OraOps11w.dll不适用于2.112.4.0版本。
Wernfried Domscheit
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.