我们的应用程序使用托管的 ODP.NET 代码来调用各种 Oracle 过程。
对于我们的一位使用公共数据库链接并在过程中引用链接表的客户,该调用失败。经过进一步测试,任何通过 ODP.NET 对链接表运行查询的尝试都会失败。
ORA-12154: TNS: 无法解析指定的连接标识符
全栈:
Oracle.ManagedDataAccess.Client.OracleException: ORA-12154: TNS:could not resolve the connect identifier specified
at OracleInternal.ServiceObjects.OracleCommandImpl.VerifyExecution(OracleConnectionImpl connectionImpl, Int32& cursorId, Boolean bThrowArrayBindRelatedErrors, OracleException& exceptionForArrayBindDML, Boolean& hasMoreRowsInDB, Boolean bFirstIterationDone)
at OracleInternal.ServiceObjects.OracleCommandImpl.ExecuteReader(String commandText, OracleParameterCollection paramColl, CommandType commandType, OracleConnectionImpl connectionImpl, OracleDataReaderImpl& rdrImpl, Int32 longFetchSize, Int64 clientInitialLOBFS, OracleDependencyImpl orclDependencyImpl, Int64[] scnForExecution, Int64[]& scnFromExecution, OracleParameterCollection& bindByPositionParamColl, Boolean& bBindParamPresent, Int64& internalInitialLOBFS, OracleException& exceptionForArrayBindDML, Boolean isDescribeOnly, Boolean isFromEF)
at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, Boolean fillRequest, CommandBehavior behavior) at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader()
at [APPLICATION CODE]
这很奇怪,因为尝试使用 SQL PLUS 进行相同的查询会成功,即使客户端计算机上没有 TNS 名称或文件。
我们的应用程序甚至不使用 TNS 名称,它使用显式连接字符串详细信息。
我们甚至通过 DevArt oracle 驱动程序运行了测试查询,它们也很成功。
就好像专门通过托管 ODP.NET 进行调用使服务器以不同的方式对待数据库链接。
ODP.NET Query (Client Machine A) > (Server A) > Table (Server B) = ERROR
SQL Plus Query (Client Machine A) > (Server A) > Table (Server B) = SUCCESS
DEV ART Query (Client Machine A) > (Server A) > Table (Server B) = SUCCESS
我们现在使用的测试查询是一个简单的 SELECT 语句
有谁知道我们如何让 ODP.NET 像 SQL Plus 一样将这些信息推迟到服务器上?
数据库链接信息:
OWNER: PUBLIC
USERNAME: [FIXED OTHER USER]