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

Nil*_*Pun 7 oracle odp.net winforms c#-3.0

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

它适用于某些人,不适用于其他人.

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

  1. 它取决于我正在安装应用程序的服务器吗?要么

  2. 它依赖于后端oracle数据库吗?

b_l*_*itt 5

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

TLDR版本:

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

完整版本:

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

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

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

也就是说,当您加载Oracle.DataAccess时,它会尝试查找所需的非托管客户端dll.从Oracle文档:

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

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

2.应用程序配置或web.config指定的DLL路径设置.

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

4. Windows注册表指定的DLL路径设置.

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>
Run Code Online (Sandbox Code Playgroud)

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

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

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


Pat*_*man 1

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

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

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

也许这篇文章对您也有用。