由于遗留原因,我们的 .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 驱动程序保持注册状态。
这导致了一些我无法解释的有趣/奇怪的行为:
- 如果首先使用应用程序的“来自 11.2.0.3.0 的 ODP.NET”部分,则两个提供程序都可以连接,这意味着“来自 11.2.0.1.0 的 OLEDB”正在使用 _2 主页中的 tnsnames.ora。
- 如果首先使用应用程序的“来自 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 文件。
一个供应商如何影响另一家供应商?