C# 为什么我的连接字符串中出现ORA-12504错误?
我是oracle的初学者,想用c#windows应用程序连接oracle数据库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
但为什么我尝试连接数据库,我得到了这个错误:
我的侦听器文件如下:
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