为什么我的连接字符串中出现ORA-12504错误?

时间:2015-11-02 11:16:36

标签: c# oracle

我是oracle的初学者,想用c#windows appliation连接oracle数据库 但为什么我尝试连接数据库我得到这个错误:
enter image description here


我的听众文件是这样的:

MYLISTNER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = DESKTOP-A5CFJSH)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

SID_LIST_MYLISTNER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\app\BEHZAD-HUSH\product\11.2.0\dbhome_2)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:C:\app\BEHZAD-HUSH\product\11.2.0\dbhome_2\bin\oraclr11.dll")
    )
  )

ADR_BASE_MYLISTNER = C:\app\BEHZAD-HUSH


我的tnsnames文件是:

ORACLR_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
    (CONNECT_DATA =
      (SID = CLRExtProc)
      (PRESENTATION = RO)
    )
  )


会发生什么?我该如何解决?谢谢。


我的tns ping是:

TNS Ping Utility for 64-bit Windows: Version 11.2.0.1.0 - Production on 02-NOV-2015 15:42:22

Copyright (c) 1997, 2010, Oracle.  All rights reserved.

Used parameter files:
C:\app\BEHZAD-HUSH\product\11.2.0\dbhome_2\network\admin\sqlnet.ora


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))) (CONNECT_DATA = (SID = CLRExtProc) (PRESENTATION = RO)))
TNS-12541: TNS:no listener

2 个答案:

答案 0 :(得分:0)

服务器名称应来自TNS(ORACLR_CONNECTION_DATA),而不是localhost。

修改

  

TNS-12541:TNS:没有听众

检查tns侦听器是否正在运行。

CMD> lsnrctl
LSNRCTL> start

在开始开发应用程序之前,必须先通过tnsping / sqlplus检查数据库连接。只有在您成功连接后,您才能继续前进。

如果侦听器是非常有效的,你就不能尝试通过tcp / ip连接,而不是通过IPC连接(在tnsnames.ora中更改tns连接字符串之后) -

ORACLR_CONNECTION_DATA = 
 (DESCRIPTION = 
    (ADDRESS = (PROTOCOL = TCP) (HOST = DESKTOP-A5CFJSH) (PORT = 1521)) 
    (CONNECT_DATA = (SID = CLRExtProc))
 )

答案 1 :(得分:0)

TNS是一把真正的双刃剑。当它工作时,它运行良好,但如果您无法控制部署应用程序的客户端计算机,您可能只想跳过它并直接连接。

幸运的是,Oracle提出了ezConnect,它大大简化了连接字符串。它本质上是:

server/port:service name (or SID)

通过显式指定通常封装在TNSNAME中的元素,可以消除目标机器对该TNS名称具有不同定义的任何可能性,或者更糟糕的是,根本没有定义。

或者,如果您使用Direct=true,您仍然可以绕过TNSnames并明确说明服务器,端口和服务名称:

String conString = String.Format("Direct=true;Server={0};" +
    "Port={1};Service Name={2};User Id={3};Password={4};",
    "myhost.foo.bar", 1521, "oraprod", "scott", "tiger");

或使用SID(我永远不会记得哪些有用,所以我都尝试了):

String conString = String.Format("Direct=true;Server={0};" +
    "Port={1};SID={2};User Id={3};Password={4};",
    "myhost.foo.bar", 1521, "oraprod", "scott", "tiger");

然后:

OracleConnection conn = new OracleConnection(constring);
conn.Open();

(当然有适当的错误捕获)。

这比您要求的信息更多,但最重要的是,当您建立连接时,我会将其用作"服务器名称"在对话框中:

DESKTOP-A5CFJSH:1521/CLRExtProc