为什么托管 ODP.Net 需要 SERVICE_NAME?
Why does Managed ODP.Net demand SERVICE_NAME?
我正在将 .Net 4.6.2 应用程序从使用 Microsoft 的 System.Data.OracleClient 迁移到 Oracle 自己管理的 ODP.Net(Nuget 包,版本 12.2.11)以连接到 Oracle 数据库。我安装了 Oracle 客户端 (11gR2),除了更改引用、使用子句、类型名称等之外,代码几乎相同。然而,虽然我的预迁移代码连接得非常愉快,但 post-migrate 不会连接。相反,它抛出一个 OracleException
ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA.
tnsnames.ora文件是一样的,应用程序的连接字符串也是一样的,我以前从来不需要指定服务名。
TnsNames.ora:
ORACLEDBSERVER2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = OracleDBServer2)(PORT = 1521))
)
(CONNECT_DATA =
(SID = orcdb10g)
(SERVER = DEDICATED)
)
连接字符串:
USER ID=MATTESTNHADMIN;PASSWORD=XXXXX;DATA SOURCE=oracledbserver2
为什么现在要求服务名称?即使我在 CONNECT_DATA 部分添加一个子句 (SERVICE_NAME = orcdb10g)
我也会得到同样的错误。
我假设您的程序没有找到 tnsnames.ora
文件。与旧驱动程序不同,ODP.NET 托管驱动程序不会从注册表中读取 TNS_ADMIN
值。
查看此答案 了解 ODP.NET 托管驱动程序如何查找 tnsnames.ora
文件。
请注意,当您使用 ODP.NET 托管驱动程序时,您无需再安装任何 Oracle 客户端。
我正在将 .Net 4.6.2 应用程序从使用 Microsoft 的 System.Data.OracleClient 迁移到 Oracle 自己管理的 ODP.Net(Nuget 包,版本 12.2.11)以连接到 Oracle 数据库。我安装了 Oracle 客户端 (11gR2),除了更改引用、使用子句、类型名称等之外,代码几乎相同。然而,虽然我的预迁移代码连接得非常愉快,但 post-migrate 不会连接。相反,它抛出一个 OracleException
ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA.
tnsnames.ora文件是一样的,应用程序的连接字符串也是一样的,我以前从来不需要指定服务名。
TnsNames.ora:
ORACLEDBSERVER2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = OracleDBServer2)(PORT = 1521))
)
(CONNECT_DATA =
(SID = orcdb10g)
(SERVER = DEDICATED)
)
连接字符串:
USER ID=MATTESTNHADMIN;PASSWORD=XXXXX;DATA SOURCE=oracledbserver2
为什么现在要求服务名称?即使我在 CONNECT_DATA 部分添加一个子句 (SERVICE_NAME = orcdb10g)
我也会得到同样的错误。
我假设您的程序没有找到 tnsnames.ora
文件。与旧驱动程序不同,ODP.NET 托管驱动程序不会从注册表中读取 TNS_ADMIN
值。
查看此答案 tnsnames.ora
文件。
请注意,当您使用 ODP.NET 托管驱动程序时,您无需再安装任何 Oracle 客户端。