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

C# 为什么我的连接字符串中出现ORA-12504错误?,c#,oracle,C#,Oracle,我是oracle的初学者,想用c#windows应用程序连接oracle数据库 但为什么我尝试连接数据库,我得到了这个错误: 我的侦听器文件如下: MYLISTNER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = DESKTOP-A5CFJSH)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC15

我是oracle的初学者,想用c#windows应用程序连接oracle数据库
但为什么我尝试连接数据库,我得到了这个错误:


我的侦听器文件如下:

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

服务器名称应来自TNS(ORACLR\u连接\u数据),而不是本地主机

编辑:

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))
 )

TNS是一把真正的双刃剑。当它工作时,它工作得很好,但是如果你不能控制你部署应用的客户端机器,你可能只想跳过它直接连接

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

server/port:service name (or SID)
通过显式指定通常封装在TNSNAMEs中的元素,可以消除目标机器对该TNS名称有不同定义的可能性,或者更糟的是,根本没有定义

或者,如果您使用
Direct=true
,您仍然可以绕过tnsname并显式拼写服务器、端口和服务名称:

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(我永远记不起哪一个有效,所以我两个都尝试):

然后:

OracleConnection conn = new OracleConnection(constring);
conn.Open();
(当然,有适当的错误捕获)

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

DESKTOP-A5CFJSH:1521/CLRExtProc

感谢您的回答,但我收到了以下错误:无法解析指定的连接标识符。请在问题中添加“tnsping ORACLR\u CONNECTION\u DATA”输出。请查看我的问题始终使用tnsping检查连接。如果它给出了一个错误,那么尝试连接到其他应用程序是没有意义的。你截屏的窗口是从哪里来的?如果是应用程序,则至少需要发布构建连接字符串的代码。
DESKTOP-A5CFJSH:1521/CLRExtProc