首页 > 解决方案 > ODP.NET 托管驱动程序 tnsnames.ora 优先顺序

问题描述

我已经构建了一个小型 WinForms 应用程序,并且正在使用 ODP.NET 托管驱动程序连接到 Oracle 数据库。我已按照本文档中的说明使用 application.config 文件设置连接:

http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/12c/r1/appdev/dotnet/Web_version_Fully_Managed_ODPnet_OBE/odpnetmngdrv.html

根据我在几个地方找到的文档,我的印象是 application.config 文件在数据库别名解析方面具有最高优先级。例如:https ://docs.oracle.com/cd/E48297_01/doc/win.121/e41125/featConfig.htm#autoId6

但是我遇到的是,如果存在 TNS_ADMIN 环境变量,它的优先级高于 .NET 配置文件中“dataSources”部分中的数据源别名。我知道 TNS_ADMIN 设置是配置连接的一个选项,但我没有在我的 application.config 文件中配置此设置。

该线程中的最后 2 个帖子似乎指的是我遇到的相同问题。 https://community.oracle.com/message/10610812#10610812

最后一篇文章声称该问题是由于在 machine.config 设置中定义了 TNS_ADMIN 并且这会覆盖其他所有内容。但是,这与此处的文档相矛盾:https ://docs.oracle.com/cd/E48297_01/doc/win.121/e41125/featConfig.htm#autoId4

我还尝试搜索所有 4 个 machine.config 文件,但找不到对 TNS_ADMIN 的任何引用。因此,在我的情况下,肯定会优先考虑 TNS_ADMIN 位置,但我无法找到对 TNS_ADMIN 变量的引用。

我在上面第二个链接中发布的官方优先顺序是否准确?machine.config 呢?我应该在哪里寻找对 TNS_ADMIN 变量的引用?

标签: c#.netoracleodp.net

解决方案


这似乎是一个困难的话题。从 Microsoft Sysinternals下载Process Monitor并查看哪些文件以何种顺序加载。

我认为优先顺序取决于版本,并且文档肯定是错误的。

Oracle Data Provider for .NET Developer's Guide中没有提及TNS_ADMIN环境变量,但是当您使用 Process Monitor 检查时,您会看到它已被占用(据我所知,即使是最高优先级)

当您安装最新版本 12.2 的 ODP.NET 托管驱动程序时,您会在注册表中获得条目,HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET.Managed\4.122.1.0\TNS_ADMIN尽管文档显示未使用注册表。

所以我的建议是:将所有可能的值设置到同一个文件夹,甚至在%ORACLE_HOME%\network\admin指向tnsnames.ora.

另请参阅确定相关 tnsnames.ora 文件的位置


推荐阅读