【问题标题】:Why does Managed ODP.Net demand SERVICE_NAME?为什么托管 ODP.Net 需要 SERVICE_NAME?
【发布时间】:2018-04-28 15:55:34
【问题描述】:

我正在将 .Net 4.6.2 应用程序从使用 Microsoft 的 System.Data.OracleClient 迁移到 Oracle 自己的托管 ODP.Net(Nuget 包,版本 12.2.11)以连接到 Oracle 数据库。我安装了 Oracle 客户端(11gR2),除了更改引用、使用子句、类型名称等之外,代码几乎相同。但是,虽然我的迁移前代码连接得非常愉快,但迁移后的代码却无法连接。相反,它会抛出一个 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) 添加一个子句,我也会遇到同样的错误。

【问题讨论】:

    标签: oracle odp.net


    【解决方案1】:

    我假设您的程序找不到tnsnames.ora 文件。与旧驱动程序不同,ODP.NET 托管驱动程序不会从 Registy 读取 TNS_ADMIN 值。

    查看此答案https://stackoverflow.com/a/28283924/3027266 以了解 ODP.NET 托管驱动程序如何查找 tnsnames.ora 文件。

    注意,当您使用 ODP.NET 托管驱动程序时,您无需再安装任何 Oracle 客户端。

    【讨论】:

    • 感谢您的洞察力。将 tnsnames.ora 文件复制到可执行文件夹似乎已经成功了。我很想知道甲骨文为什么要引入这个看似毫无意义的改变!为了避免混淆,我猜这里需要一个符号链接。
    • 正如我在链接答案中指出的那样,您的 tnsnames.ora 文件的发现方式并没有通用的方法。有几个选项,但都应该指向同一个文件夹。是的,如果需要使用符号链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 2020-11-21
    • 2018-08-21
    • 1970-01-01
    相关资源
    最近更新 更多