为什么托管 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 客户端。