【问题标题】:How to determine which version of "Oracle.DataAccess.dll" to include如何确定要包含哪个版本的“Oracle.DataAccess.dll”
【发布时间】:2014-01-21 21:31:30
【问题描述】:

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

它对某些人有效,对其他人无效。

谁能帮帮我,我如何确定要使用哪个版本的“Oralce.DataAccess.dll”,即 9 或 10 或 11 或 9.1.* 或 10.1.* 或 11.* 或 12 等。

  1. 这是否取决于我安装应用程序的服务器?或者

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

【问题讨论】:

  • 问题到底是什么意思,它不起作用?你会遇到什么样的错误?应用服务器和数据库服务器是同一台机器还是你在应用服务器上安装Oracle客户端?

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


【解决方案1】:

我赞同使用100% managed provider 的想法。它消除了了解我将要讨论的细节的需要。这里唯一的问题是我认为您可能需要升级到 .net 4.0。

TLDR 版本:

  • 改用 12c 100% 托管提​​供程序。
  • 简短的回答是不要将提供程序 (Oracle.DataAccess.dll) 与不同版本的非托管客户端混用(至少不要向后)。
  • 考虑重新设计以包含一个服务层,这样一来就无需在客户端上安装 Oracle 提供程序。

完整版:

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

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

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

也就是说,当您加载 Oracle.DataAccess 时,它会按照一个顺序尝试定位它需要的非托管客户端 dll。来自Oracle Documentation

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

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

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

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

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

HKEY_LOCAL_MACHINE\Software\Oracle\ODP.NET\version\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 是最小的并且包含“即时客户端”或者,您应该考虑最低系统要求 - 即。系统必须至少安装 X 版本的 odp.net。然后,您可以针对该最小 dll 进行编译,并在目标系统具有较新版本的客户端时依赖发布者策略重定向。

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

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

【讨论】:

  • 谢谢。如何查看当前安装的oracle客户端版本?
  • 寻找当前客户端版本的一些建议:stackoverflow.com/questions/1171643/…
  • 好的,这是一个有趣的行为。我的 .NET Win App 在我的笔记本电脑和 UAT 服务器上使用“Oracle.DataAccess.dll”版本 11 运行。但是,它仅适用于生产服务器上的“oracle.Data.Access.dll”版本 9。我究竟做错了什么?需要在生产中升级 ODP.NET 还是其他?
  • 为什么这会让您感到惊讶?听起来您在服务器上有一个非常旧版本的客户端。发布者政策允许您针对比您引用的新版本运行,但我怀疑是否有政策可以退回 2 个主要版本。您可以在服务器上升级或使用托管提供程序。
【解决方案2】:

首先澄清一下: 您有一个 Oracle 数据库服务器(您称其为“后端 Oracle 数据库”)和一个 Oracle 客户端(无论它是否安装在应用程序服务器,从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 彼此不兼容,也就是说,您必须向客户提供两个不同的应用程序设置文件,并且客户必须根据其本地 oracle 客户端安装选择正确的一个。

我不知道 2.0 和 4.0 的情况,我至今没用过 4.0。

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

在您的开发中,您只需要注意这些市长版本,例如 2.0。 然后,您的本地 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

【讨论】:

  • 我正在使用“oracle.dataaccess.dll”11g 版本,但为什么它不起作用,但当我使用 9g 版本时它可以工作?不应该是向后兼容的吗?
  • 你的意思是数据库是9i版本?错误信息是什么?
  • 我的意思是“oracle.database.dll”版本 9。错误消息是不兼容的 oracle 数据提供程序
  • 您的意思是您的 Oracle 客户端是第 9 版?它还能在 Windows XP 甚至 Windows 2000 上运行吗? Oracle.DataAccess.dll 的版本必须始终匹配已安装的 Oracle 客户端版本。您的 Oracle 客户端安装的准确 版本是什么?Oracle.DataAccess.dll 的准确 版本是什么?
  • .Net 框架上的编号并不奇怪,因为 .Net v3 版本在技术上只是 v2 的补丁。所以 v2 和 v3 在技术上是同一事物的不同子版本,因此为什么会从 v2 跳转到 v4。
【解决方案3】:

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

ORACLE_HOME\product\11.2.0\dbhome_1\ODP.NET\bin\2.x

您会在此处找到文件 - Oracle.DataAccess.dll

只需包含在您的参考中即可。

【讨论】:

    【解决方案4】:

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

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

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

    也许this article对你也有用。

    【讨论】:

    • 应用服务器或oracle数据库服务器的进程架构?
    • 首先是应用程序。但是如果您的程序显示 32 位,则必须安装 32 位 OCI 客户端。如果您的程序显示 64 位,则必须安装 64 位 OCI 客户端。如果您的程序显示 MSIL,那么您在编译时永远不知道自己需要什么,因为实际执行的服务器可能是其中的任何一个。
    【解决方案5】:

    如果您的 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

    【讨论】:

      【解决方案6】:

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

      它发生在我身上(这个主题对我有很大帮助)并且是我在 IIS 中的应用程序池的配置不允许 32 位应用程序(高级设置)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-30
        • 2011-09-14
        • 2011-09-27
        • 2017-08-14
        • 2011-07-08
        • 2021-04-05
        相关资源
        最近更新 更多