为什么Managed ODP.Net需要SERVICE_NAME?

时间:2017-11-15 12:15:15

标签: oracle odp.net

我正在将.Net 4.6.2应用程序从使用Microsoft的System.Data.OracleClient迁移到Oracle自己的托管ODP.Net(Nuget包,版本12.2.11)以连接到Oracle数据库。我安装了Oracle客户端(11gR2),除了更改引用,使用子句,类型名称等,代码几乎相同。但是,虽然我的迁移前代码非常愉快地连接,但迁移后的代码将无法连接。相反,它会抛出OracleException

$config['sess_save_path'] =  BASEPATH . 'cache/';

tnsnames.ora文件是相同的,应用程序的连接字符串是相同的,我以前从未需要指定服务名称。

TNSNAMES.ORA:

ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA.

连接字符串:

ORACLEDBSERVER2 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = OracleDBServer2)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = orcdb10g)
      (SERVER = DEDICATED)
    )

为什么要求服务名称?即使我向CONNECT_DATA部分USER ID=MATTESTNHADMIN;PASSWORD=XXXXX;DATA SOURCE=oracledbserver2 添加了一个子句,我也会得到同样的错误。

1 个答案:

答案 0 :(得分:1)

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

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

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