如何确定要包含哪个版本的“Oracle.DataAccess.dll”

时间:2014-01-21 21:31:31

标签: winforms oracle c#-3.0 odp.net

在将.NET 3.5 Windows窗体部署到不同环境时,我们遇到了许多无效的提供程序问题。

它适用于某些人而不适用于其他人。

有人可以帮帮我,我该如何确定使用哪个版本的“Oralce.DataAccess.dll”,即9或10或11或9.1。*或10.1。*或11. *或12等。

  1. 是否依赖于我正在安装应用程序的服务器? OR

  2. 是否依赖于后端oracle数据库?

6 个答案:

答案 0 :(得分:5)

我的第二个概念是使用100% managed provider。它不需要知道我即将讨论的细节。这里唯一的问题是我认为您可能需要升级到.net 4.0。

TLDR版本:

  • 请改用12c 100%托管服务提供商。
  • 简短的回答是不要将提供程序(Oracle.DataAccess.dll)与不同版本的非托管客户端混合(至少不要向后)。
  • 考虑重新设计以包含一个服务层,从而消除了首先在客户端上安装Oracle提供程序的需要。

完整版:

首先,让我们确保了解旧的未经授权的提供程序(而不是新的12c 100%托管提供程序)的组件。它由两部分组成:

  1. 托管的.net组件 - Oracle.DataAccess.dll
  2. 非托管(非网络)客户端
  3. 简单来说,Oracle.DataAccess.dll几乎只是一个包装器,将.net指令转换为非托管客户端的ORACLE-NET指令。

    也就是说,当您加载Oracle.DataAccess时,它会尝试查找所需的非托管客户端dll。来自Oracle Documentation

      

    Oracle.DataAccess.dll搜索依赖的非托管DLL(例如   作为Oracle客户端)基于以下顺序:

         

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

         

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

         

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

         

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

         

    HKEY_LOCAL_MACHINE \ SOFTWARE \ ORACLE \ \版本ODP.NET \ DllPath的

         

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

    如果您在计算机上安装了多个客户端,则会发挥作用,因此这可能是您的问题的一部分。如果是这样,最简单的方法是在配置中使用dllPath配置变量:

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

    现在,直接回答你的问题 - 我不相信Oracle支持Oracle.DataAccess.dll与它的客户端不匹配(至少不会倒退)。您最好的选择是安装ODP.net与您的应用程序安装 - xcopy version是最小的并包含“即时客户端”或者,您应该考虑最低系统要求 - 即。系统必须至少安装了odp.net的X版本。然后,当目标系统具有客户端的NEWER版本时,您可以针对该最小dll进行编译并依赖发布者策略重定向。

    当然这也促使我询问有关建筑的问题。您是否计划提示用户使用他们的Oracle帐户?如果没有,您必须小心保护应用程序将使用的共享服务帐户。您可能最好调用一个代表客户端进行oracle调用的Web服务 - 为您提供另一个安全层并简化您的客户端部署。

    大多数版本的ODP.net都向后兼容数据库服务器 - 您当然可以将11g提供程序与10g数据库一起使用。

答案 1 :(得分:3)

首先澄清: 您有一个Oracle数据库服务器(您称之为“后端oracle数据库”)和一个Oracle 客户端(无论它是否安装在应用程序服务器上< / em>,从Oracle的角度来看,它是客户端)

ODP.NET(Oracle Data Provider for .NET,即Oracle.DataAccess.dll和更多文件)的版本由Oracle客户端定义。您几乎可以使用每个ODP.NET版本连接到每个Oracle数据库版本 - 或多或少。

错误消息“提供程序与Oracle客户端版本不兼容”也可能意味着根本没有安装ODP.NET提供程序。在这种情况下,错误消息确实有点误导。因此,首先检查是否安装了ODP.NET,它不包含在标准的Oracle Instant Client安装中。

当我检查Oracle的所有可用下载时,您有ODP.NET版本

  • 9. 东西
  • 10 东西
  • 的1.x
  • 2.0
  • 4.0

9。?和10.?指的是Oracle的版本,1.x,2.0和4.0指的是Microsoft .NET Framwork的版本(奇怪的编号,但就是这样)。版本9.?和10.?很老了,我认为使用它们没有任何意义。直到Oracle客户端版本11.1,才支持1.x.

  • 如果您的Oracle客户端是11.2或更高版本,则必须包含ODP.NET版本2.0或4.0。
  • 如果您的Oracle客户端介于10.2和11.1之间,则可以使用eiter ODP.NET版本1.x或2.0
  • 如果您的Oracle客户端超过10.2,我不知道它是如何工作的 - 它已经过时了。

版本1.x和2.0彼此不兼容,即perhpaps你必须向你的客户提供你的应用程序的两个不同的安装文件,客户必须根据他的本地oracle客户端安装选择正确的。 / p>

我不知道2.0和4.0的情况,到目前为止我从未使用过4.0。

不需要将Oralce.DataAccess.dll的本地副本放入应用程序目录中。它将从安装它的GAC(全局程序集缓存)中获取。

在您的开发中,您只需要注意这些市长版本,例如2.0。 然后你的loal GAC知道由于策略文件加载了哪个确切的版本,例如2.0.10.2.0.2.20或2.0.11.1.0.6.20或2.0.11.1.0.7.20或2.0.11.2.0.1.2或其他。

除此之外,您必须知道您的Oracle客户端是32位还是64位,并相应地包含ODP.NET。

您可以在此处获取更多信息:Oracle Data Provider for .NET FAQ

答案 2 :(得分:2)

如果您的系统中安装了客户端或oracle实例。检查文件夹名称

ORACLE_HOME \产品\ 11.2.0 \ dbhome_1 \ ODP.NET \ BIN \ 2.x的

在这里你会找到文件 - Oracle.DataAccess.dll

只需加入您的参考资料。

答案 3 :(得分:0)

事实上,我认为没有正确的答案。 这完全取决于应用程序运行的处理器体系结构(如此位),您使用的OCI客户端的版本等等。

我发现将Oracle交互包装在一个类中最有用,使用Reflection查找要使用的可用版本。

关于版本号:ODP.net程序集的版本必须与OCI客户端安装的版本匹配。将12. * OCI客户端与10. * ODP.net程序集混合是一个坏主意。

也许this article对您也很有用。

答案 4 :(得分:0)

如果您的Oracle服务器是10.2或更高版本,您可以考虑使用Oracle 12提供的托管ODP.NET版本。

显然它是一个依赖,低于10 MB。与依赖于Oracle(即时)客户端的ODP.NET版本相比,它应该使您的应用程序部署到不同的系统要容易得多。它还应该避免您必须关心任何已安装的Oracle客户端。

但是,他们确实提到它适用于“.NET Framework 4.5.1的最新版本”,因此根据我的理解,您需要将应用程序升级到4.5.1,但也许只有在您希望使用某些功能(如实体框架支持)。

http://www.oracle.com/technetwork/topics/dotnet/index-085163.html

答案 5 :(得分:0)

有时你会得到Could not load file or assembly 'Oracle.DataAccess' or one of its dependencies.,而你有正确的dll而问题出在其他地方。

它发生在我身上(这个主题帮助我解决了很多问题)而且我的应用程序池在IIS中的配置不允许32位应用程序(高级设置)。