0

问题是如何在同一台机器上并排安装 ODP.NET 2.111 和 ODP.NET 4.112,同时使用 tnsnames.ora 指向同一个数据库服务器

我需要支持基于 Oracle 11.1.0 的遗留系统。系统使用 ODP.NET 2.111 连接到 oracle。有两个客户端安装在:

C:\oracle\product\11.1.0\client_1

C:\oracle\product\11.1.0\client_2

两者的 tnsnames.ora 是这样的:

xxxx1_SERVICE=
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = xxxx2)(PORT = xxx3))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SID = xxx4)
    )
  )

yyyy1_SERVICE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = yyyy2 )(PORT = yyyy3))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SID = yyyy4)
    )
  )

kkkk1_SERVICE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = kkkkk2 )(PORT = kkkk3))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SID = kkk4)
    )
  )

pppp1_SERVICE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ppppp2 )(PORT = pppp3))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SID = pppp4)
    )
  )

oooo1_SERVICE = (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ooooo2 )(PORT = oooo3))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = oooo4)
    )
  )

系统使用上述设置启动并运行。我需要开发一个基于 EntityFramework 的新系统,这需要我使用更新版本的 Oracle.DataAccess.Dll (4.112)。

我想知道如何在不损害旧系统功能的情况下安装新客户端,以便两者可以并行工作:

注意:我确实尝试在以前的客户端上安装新的 ODP.NET,并且能够使用以下连接字符串连接到数据库:

DATA SOURCE=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=zzzzz1)(PORT=zzzzz2)))(CONNECT_DATA=(SERVICE_NAME=zzz3_SERVICE)));用户ID=\"zzzz4\";密码=\"zzzz5\";

那是不可取的,因为 1- 它破坏了旧系统,因为由于 ODP.NET 中的升级,它不再可以连接到 Oracle 2- 连接字符串看起来很奇怪

我将不胜感激任何帮助,

谢谢,艾丁

4

1 回答 1

0

简短的回答:

注意:我确实尝试在以前的客户端上安装新的 ODP.NET,并且能够使用以下连接字符串连接到数据库...

这表明您的新安装在 /Network/Admin 中没有 tnsnames.ora 和 sqlnet.ora。如果您对使用新 ODP.net 安装的旧客户端没问题,那么您可以从旧安装中复制它们,或者您可以使用TNS_ADMIN环境变量为所有实例指定全局位置,即TNS_ADMIN=C:\MyOracleFilesDir

长答案:

当您安装新客户端时,它很可能还会将发布者策略文件安装到 GAC 中,从而在程序集解析过程中将对旧 Oracle.DataAccess.dll 的引用重定向到新版本。Oracle.DataAccess 然后通过注册表中的参数 (DllPath) 定位客户端。您可以通过在 .config 文件中设置 dllPath 来覆盖此位置:

<configuration>
  <oracle.dataaccess.client>
    <add key="DllPath"            value="C:\yourotherpath"/>
  </oracle.dataaccess.client>
</configuration>

这通常是我所做的,但随着我对这一点的了解更多,我意识到我正在对旧客户端强制使用更新的 dll。如果您的目标是保持旧客户端不变,更好的选择可能是从 GAC 中删除发布者策略(我认为它们甚至没有与完整的 ODAC 一起安装,只有 ODP.net):

广汽截图

如果您需要重新安装它们,它们通常位于 oraclepath\odp.net\PublisherPolicy。

另一个,也许是更好的长期选择,是配置旧客户端忽略发布者策略:http: //msdn.microsoft.com/en-us/library/cf9025zt%28v=vs.80%29.aspx

最后,我很确定 2.0 和 4.0 框架的 .net 组件在 ODP.net 安装期间是单独的安装选项。我认为您只需不安装 2.0 组件即可避免此问题。在那一点上,您可以通过针对 64 位 odp.net 开发新项目来做类似的工作。像v2​​.0 和v4.0 一样,32 位和64 位也没有任何相互认识。

于 2013-03-19T20:35:52.750 回答