Winforms 如何确定“文件”的哪个版本;Oracle.DataAccess.dll“;包括

Winforms 如何确定“文件”的哪个版本;Oracle.DataAccess.dll“;包括,winforms,oracle,c#-3.0,odp.net,Winforms,Oracle,C# 3.0,Odp.net,在将.NET 3.5 Windows窗体部署到不同环境时,我们遇到了许多无效的提供程序问题 它对某些人有效,对其他人无效 有人能帮我一个忙吗?我如何确定使用哪个版本的“Oralce.DataAccess.dll”,即9或10或11或9.1.*或10.1.*或11.*或12等 它是否取决于安装应用程序的服务器?或 它是否依赖于后端oracle数据库 事实上,我相信没有正确的答案。 这完全取决于应用程序运行时使用的处理器体系结构(so位)、您使用的OCI客户端版本等 我发现将Oracle交互封装在一

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

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

有人能帮我一个忙吗?我如何确定使用哪个版本的“Oralce.DataAccess.dll”,即9或10或11或9.1.*或10.1.*或11.*或12等

  • 它是否取决于安装应用程序的服务器?或

  • 它是否依赖于后端oracle数据库


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

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

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


    可能对您也有帮助。

    首先,请澄清: 您有一个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。 然后,您的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


    这里你可以得到更多的信息:

    < P>如果你的Oracle服务器是10.2或更高版本,你可以简单地考虑使用Oracle 12提供的托管ODPNET版本。 显然这是一个依赖项,小于10MB。与依赖Oracle(instant)客户端的ODP.NET版本相比,将应用程序部署到不同的系统应该更容易。它还应该避免您必须关心任何已安装的Oracle客户端

    但是,他们确实提到它在“最新版本的.NET Framework 4.5.1”上工作,因此据我所知,您需要将应用程序升级到4.5.1,但可能只有在您希望使用某些功能(如实体框架支持)的情况下才需要这样做


    我赞成使用。这样就不需要知道我将要讨论的细节。这里唯一的问题是,我认为您可能需要升级到.NET4.0

    TLDR版本:

    • 请改用12c 100%托管提供程序
    • 简而言之,不要将提供程序(Oracle.DataAccess.dll)与非托管客户端的不同版本混合使用(至少不要向后)
    • 考虑重新设计以包括一个服务层,该层首先消除了在客户端上使用Oracle提供程序的需要
    完整版本:

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

  • 托管.net组件-Oracle.DataAccess.dll
  • 非托管(非.net)客户端
  • 简单地说,Oracle.DataAccess.dll几乎只是一个包装器,为非托管客户端将.net指令转换为Oracle-net指令

    也就是说,当您加载Oracle.DataAccess时,它会按照一定的顺序尝试查找所需的非托管客户端DLL。从:

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

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

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

    3.machine.config指定的DllPath设置

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

    HKEY\U LOCAL\U MACHINE\Software\Oracle\ODP.NET\version\DllPath

    5.Windows路径环境变量指定的目录
    <configuration>
      <oracle.dataaccess.client> 
        <add key="DllPath" value="c:\oracle\product\1.1.0-xcopy-dep\BIN"/>
      </oracle.dataaccess.client>
    </configuration>