1

由于遗留原因,我们的 .NET 4.0 应用程序当前使用 Oracle OLEDB 和 ODP.NET 提供程序来连接到 Oracle 实例。我们在 11.2.0.3.0 Oracle 客户端上进行了标准化。安装一个 Oracle 客户端后,两个数据提供程序都按预期工作。

已在已安装 11.2.0.1.0 客户端的计算机上报告了问题。为我们的应用程序安装了第二个客户端 11.2.0.3.0。安装如下所示:

c:\oracle
    \product
      \11.2.0
        \client_1      <-- (existing) 11.2.0.1.0
          \bin         <-- OraOLEDB11.dll registered here
          \network
            \admin     <-- TNSNAMES does NOT contain ORACLESVR
        \client_2      <-- (new) 11.2.0.3.0
          \bin  
          \network
            \admin     <-- TNSNAMES contains ORACLESVR

由于 11.2.0.3.0 安装程序中的错误,OLEDB 驱动程序未在第二个主目录中注册,这意味着 11.2.0.1.0 驱动程序保持注册状态。

这导致了一些我无法解释的有趣/奇怪的行为:

  1. 如果首先使用应用程序的“来自 11.2.0.3.0 的 ODP.NET”部分,则两个提供程序都可以连接,这意味着“来自 11.2.0.1.0 的 OLEDB”正在使用 _2 主页中的 tnsnames.ora。
  2. 如果首先使用应用程序的“来自 11.2.0.1.0 的 OLEDB”部分,则这两个提供商都不会连接,可能是因为两者都使用 _1 主页中的 tnsnames.ora。

因此,一旦为应用程序确定了 Oracle 主目录,两个客户端都会尝试使用该主目录,从而导致完全成功或完全失败。

要解决此问题,我们可以执行以下操作:注册 11.2.0.3.0 OLEDB 提供程序,添加 TNS_ADMIN 环境变量,或添加ORACLESVR_1 主目录中的 tnsnames.ora。

但是,我想知道为什么会这样?在每个提供程序的 Oracle 文档中,我找不到在存在两个客户端且未指定 TNS_ADMIN 时如何定位 tnsnames.ora 文件。

一个供应商如何影响另一家供应商?

4

1 回答 1

1

OLEDB 基于 Microsoft COM,您注册的每个 DLL 都必须有一个不同的名称。因此,您不能OraOLEDB11.dll从不同位置多次注册,即 OLEDB 只能安装一次(每个架构)。

如果您尝试在一台机器上安装多个 OLEDB,Oracle 安装程序会造成混乱。安装多个 Oracle 客户端总是一个挑战。

分别搜索这些位置tnsnames.orasqlnet.ora

  1. 当前路径(与正在运行的客户端应用程序相关联)
  2. TNS_ADMIN为会话定义的环境变量
  3. TNS_ADMIN为系统定义的环境变量
  4. Windows 注册表项HKLM\SOFTWARE\ORACLE\KEY_{ORACLE_HOME_NAME}\TNS_ADMIN(适用于 x64)或HKLM\SOFTWARE\Wow6432Node\ORACLE\KEY_{ORACLE_HOME_NAME}\TNS_ADMIN(适用于 x86)
  5. %ORACLE_HOME%\network\admin

我从 Oracle Metalink 111942.1 得到这个列表(指 Oracle 9.x 和 Windows NT/2000)

我不知道它是否适用于您可能使用的每个单独的 Oracle 提供程序/驱动程序。当您使用Process Monitor跟踪您的应用程序时,您可以获得不同的顺序。

于 2015-01-23T07:24:23.037 回答