环境是VS2013+ODP.NET 11.2.0.1.0+Oracle 11g r2
using Oracle.DataAccess.Client; namespace OracleDbTest { class Program { private const string Connstring = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1527))" + "(CONNECT_DATA=(SID=orcl)));User Id=sakai;Password=sakai;"; static void Main(string[] args) { using (OracleConnection conn = new OracleConnection(Connstring)) { conn.Open(); string sql = "SELECT * FROM SAKAI_ALIAS"; OracleDataAdapter da = new OracleDataAdapter(sql,conn); DataTable dt = new DataTable(); da.Fill(dt); } } }
运行时就报ORA-12541: TNS: 无监听程序
但是PL/SQL和SQLPLUS都能够连接
运行lsnrctl status显示已经启动
求解决。是不是我VS版本太高了?
既然你的 PL/SQL 能连接,那就说明服务器配置和客户端配置没问题,我建议你找到 Oracle Client 安装目录下的配置文件,找到 tns name ,使用 tns name 或者整个字符串作为你的连接字符串。
有一个地方我不太明白
我的机器上既装了Oracle又装了ODP.NET,两个分别装在不同的地方。但是Oracle里也有ODP.NET的目录,这两个有没有关联?
另外,我的tnsnames.ora里面的内容是这样的
ORCL = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) )
和我在问题中写的内容似乎是一样的啊
@飞鸟_Asuka: 连接字符串这样写:Data Source= orcl
@Launcher: 非常感谢!能成功连接了
但是为什么这样就可以呢?
@飞鸟_Asuka: orcl 是 tnsnames.ora 中配置的别名,连接 oralce 时的连接字符串有两种写法,一种就是使用别名(Data Source = orcl),另一种就是把 ORCL = 后面的字符串直接拷贝过来:
Data Source = (DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
@Launcher: 哦,看了下之前的似乎是之前的写的有问题。
谢谢
根据tnsnames.ora修改