ODP.NET 和托管连接因 ORA-12154 而失败

ODP.NET and managed connections fail with ORA-12154

我认为通过 Oracle.ManagedDataAccess.Core NuGet 包使用 ODP.Net 托管连接的全部意义在于您不需要在 运行time 环境中安装 Oracle 客户端。 我发现很多关于

的帖子

ORA-12154: TNS:could not resolve the connect identifier specified error

错误,但所有关于潜在修复的讨论都围绕客户端配置问题展开。

我完全按照 this article 中的描述进行操作。 当我从 Visual Studio 在本地 运行 时,该应用程序连接正常,但当它由 Azure 管道构建和部署时,它无法连接。来自服务器的连接不是问题,并且没有 tnsnames.ora 和 sqlnet.ora 文件,或者 TNS_ADMIN 和 ORA_HOME 环境变量。

2021-02-15T18:04:40.867284043Z       Oracle connection string: (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=<ip address>)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=<sid>)));User Id=<User>;Password=<Password>;
2021-02-15T18:04:40.871226968Z [41m[30mfail[39m[22m[49m: Microsoft.AspNetCore.Server.Kestrel[13]
2021-02-15T18:04:40.871246768Z       Connection id "0HM6HRG9F3OUG", Request id "0HM6HRG9F3OUG:00000004": An unhandled exception was thrown by the application.
2021-02-15T18:04:40.871252068Z       Oracle.ManagedDataAccess.Client.OracleException (0x80004005): ORA-12154: TNS:could not resolve the connect identifier specified
2021-02-15T18:04:40.871255568Z        ---> OracleInternal.Network.NetworkException (0x00002F7A): ORA-12154: TNS:could not resolve the connect identifier specified

我也试过这个 EZ Connect 字符串,但没有成功:

<user>/<password>@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=<ip address>)(Port=<port>))(CONNECT_DATA=(SID=<mysid>)))

我错过了什么?

更新:该问题似乎是由 Azure 混合连接管理器而非 Oracle 连接的潜在问题引起的。现在正在研究 VPN 连接。暂时保留您尝试不同连接字符串格式的建议。

我们看到了输出中的内容,但需要了解您实际上是如何在调用应用程序中指定连接字符串的。 ora-12154 是最常见的连接问题之一,互联网上到处都是。当你用谷歌搜索时,你发现了什么?

它说您指定的 tns 连接字符串无法在客户端的 tnsnames.ora 文件中找到。由于我不知道你的客户的tnsnames的内容,我也不知道你具体指定了什么,所以我现在不能多说。

但是,如前所述,几乎每个 Oracle 博客和 Internet 上的在线资源中都写有此错误。我最喜欢的是:https://edstevensdba.wordpress.com/2018/09/19/troubleshooting-ora-12154/

还有。 . . oracle:cdb$ orer ora 12154 12154, 00000, "TNS: 无法解析指定的连接标识符" // *Cause: 使用请求连接到数据库或其他服务 // 一个连接标识符,指定的连接标识符不能 // 使用其中一种命名方法解析为连接描述符 // 配置。例如,如果使用的连接标识符类型是 // net service name 那么在a中找不到net service name // 命名方法 repository,否则 repository 不能 // 找到或到达。 // *行动: // - 如果您使用本地命名(TNSNAMES.ORA 文件): // - 确保“TNSNAMES”被列为 // Oracle Net 配置文件中的 NAMES.DIRECTORY_PATH 参数 // (SQLNET.ORA) // - 验证 TNSNAMES.ORA 文件是否存在并且位于正确的位置 // 目录并且可以访问。 // - 检查用作连接标识符的网络服务名称 // 存在于 TNSNAMES.ORA 文件中。 // - 确保 TNSNAMES.ORA 中的任何地方都没有语法错误 // 文件。查找不匹配的括号或杂散字符。错误 // 在 TNSNAMES.ORA 文件中可能会使其无法使用。 // - 如果您使用目录命名: // - 验证“LDAP”是否被列为 // Oracle Net 配置文件中的 NAMES.DIRETORY_PATH 参数 //(SQLNET.ORA)。 // - 验证 LDAP 目录服务器是否已启动并且它是 // 无障碍。 // - 验证网络服务名称或数据库名称用作 // 连接标识符在目录中配置。 // - 验证正在使用的默认上下文是否正确 // 指定完全限定的网络服务名称或完整的 LDAP DN // 作为连接标识符 // - 如果您使用简单的连接命名: // - 验证“EZCONNECT”是否被列为 // Oracle Net 配置文件中的 NAMES.DIRETORY_PATH 参数 //(SQLNET.ORA)。 // - 确保指定主机、端口和服务名称 // 是正确的。 // - 尝试将连接标识符括在引号中。 // // 请参阅 Oracle 网络服务管理员指南或 Oracle // 有关命名的更多信息的操作系统特定指南。</p>

此错误是由于应用服务与我们客户的本地旧版 Oracle 数据库之间的 Azure 混合连接配置不正确造成的。错误消息的“无法解析”部分实际上是正确的,表明存在潜在的 DNS 错误。