在C#中,我想通过OracleClient连接Oracle数据库,可是连接不上。出现错误提示:
ORA-12537: TNS:connection closed
我的操作步骤是:
1、增加引用Microsoft.Oracle.OracleClient.dll(FrameWork2.0自带的,版本是V2.0.40607__Oracle提供的那个也试过,不行)
2、代码如下:
================================================================================
#region Using directivesusing System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.OracleClient;#endregionnamespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string s = "Data Source=mydb;User ID=myid;Password=mypwd;";
            OracleConnection cn = new OracleConnection(s);
            try
            {
                cn.Open();
                Console.WriteLine("Connected !");
            }
            catch (Exception ep)
            {
                Console.WriteLine(ep.Message);
            }
            finally {
                Console.WriteLine("End !");
                Console.Read();
            }
        }
    }
}
3、程序输出:
================================================================================
ORA-12537: TNS:connection closed
End !我的运行环境是:win2000 Prfessional,FrameWork2.0, VC#2005Beta1,Oracle 8i.请高手不吝赐教!(备注:开始的时候,没装Oracle的OracleClient,出现上述错误。后来装了,还是出现上述错误.
在同一台机器上,我用VB或者VC,ADO连接ORACLE,没有问题。)

解决方案 »

  1.   

    ???VC#2005Beta1还没有提供来凝结数据库的功能,要不然就是正式版了
      

  2.   

    2003我也试过,就是因为不能连接,
    也是出这个错误提示,我才用2005Beta1版本的。2003和2005Beta1版本,出现的错误提示是一样的。
    我用了System.Data.OleDB,不用OracleClient,
    出现的错误是一样的。不知道为什么。不知道高手能不能提供可以正确连接的语句?
    我这语句有问题吗?
      

  3.   

    请查看服务中是否启动了ORACLE的监听服务。
    偶2003,一直用,偶尔没启动监听服务会出现这种情况.
      

  4.   

    谢谢各位的答复,不过现在问题尚未解决。
    7707(kingfisher) ,我想请教您,那个监听服务名字是什么?是从控制面板里面的“服务”中启动吗?敬请不吝赐教!《请教各位:如何给回答正确的朋友加分?》
      

  5.   

    管理工具--》服务找一下Oracle...TNSListener,启动它
      

  6.   

    7707(kingfisher) ,谢谢你的回答。不过我的机器上只有Oracle...ClientCache,没有TNSListener,
    Oracle数据库服务端装在UNIX上,它的TNS已经启动。
    我的机器只安装了客户端连接。
    我是通过我的机器连接UNIX的数据库。现在我启动了我机器上的...所有Oracle相关的服务,还是这个错误提示。
    百思不得其解,还请指点迷津!
      

  7.   

    7707(kingfisher)说的监听服务是指的服务器端的监听服务,如果是UNIX机器的话,下面的这个文档或许对你有用:
    ------------------------------------------------------------------------------------------
    在安装Oracle9时,安装程序自动建立一个名为LISTENER的监听器,LISTENER的默认监听端点地址为:
    TCP/IP协议,端口为1521:支持Net8客户连接;如果没有,我们也可用Oracle Ne configuration Assistant来创建监听器。其方法如下: 
    1. 运行netca,启动Oracle Net configuration Assistant。
    2. 选择”监听程序配置”,” 添加”,给出” 监听程序名”(一般使用默认设置LISTENER) ,一般选择TCP/IP协议.
    3. 配置端口号,按着提示配置即可完成监听器配置.
    ------------------------------------------------------------------------------------------
    当然这些是在UNIX的图形界面下面完成的
      

  8.   

    补充一句:
    监听net配置成功验证:%lsnrctl status
    系统会报告有无监听程序运行。如果没有,则使用%lsnrctl start启动。如果启动不成功,说明配置不成功。
      

  9.   

    加上
    using System.Data.OleDb;
    试试
      

  10.   

    谢谢各位的回答。using System.Data.OleDb;我也试过了,也是不行的。
    不过7707(kingfisher) 和52rainbow(52rainbow) 两位朋友的提示很有意义。我这边有两台Unix主机,地址分别是xxx.xxx.xxx.21和22,公用一个磁盘阵列。这两台机器,都可以通过20这个虚拟地址访问。也就是说访问20,有可能访问的是21或者22。我们的Oracle数据库,装在22上。22的/oracle/o8i/app/oracle/product/8.1.7/network/admin/listener.ora文件,里面配置的HOST地址是20。我用C#2003连接的时候,曾经遇到过有时候连接成功,有时候连接不成功的现象,我想和这个可能有关联。
    我telnet 21或者22,通过lsnrctl status查看,发现Listener启动了。如果执行lsnrctl start,都会出提示:/oracle/o8i> lsnrctl start
    LSNRCTL for DEC OSF/1 AXP: Version 8.1.7.4.0 - Production on 10-DEC-2004 16:22:40
    (c) Copyright 1998 Oracle Corporation.  All rights reserved.
    TNS-01106: Listener using listener name LISTENER has already been started
    .我也尝试把本机的tnsnames.ora中的HOST改成22,但是执行C#程序出现提示:
    ORA-12541: TNS:no listener
    这可能是22的Listener.ora里面设置成20的缘故吧,可是这个文件我不能随便乱动。奇怪的是,我用VB做了一个测试,引用ADO,Connection连接语句这样写的:
    "UID=myid;PWD=mypwd;DRIVER={Microsoft ODBC for Oracle};SERVER=mydb"
    就可以成功,而且一点问题都没有。//////////////////////////////////////////////////////////////////////////////////======>
    是OracleClient的缺陷吗?OleDb连接,也是不行,出现的错误提示和OracleClient是一样的。
    更为奇怪的是,我在C#中引用了ADO,不是ADO.NET,使用和VB同样的Connection语句,竟然出现
    了同样的问题!
    ORA-12537: TNS:connection closed !!!真不知道该如何是好,现在我在C#和Java的选择中徘徊了。
    虽然我心目中对于微软的开发工具很有好感,可是现在基本的连接问题解决不了了! 
    还望各位能不吝赐教!!!
    //////////////////////////////////////////////////////////////////////////////////<======
    另外我的tnsnames.ora内容是:
    mydb =
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.20)(PORT = 1521))
        )
        (CONNECT_DATA =
          (SID = mydb)
        )
      )
      

  11.   

    另:
    /oracle/o8i/app/oracle/product/8.1.7/network/admin/listener.ora文件的内容是:LISTENER =
      (DESCRIPTION_LIST =
        (DESCRIPTION =
          (ADDRESS_LIST =
            (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
          )
          (ADDRESS_LIST =
            (ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.20)(PORT = 1521))
          )
        )
      )...
      

  12.   

    wolfpk(wolfpk) ,谢谢你!
    这个连接字符串,是我从OracleClient的文档中拷贝过来的。
    我在Google上搜索了好多连接的示例,最后总结出这么一个连接的例子来。
    当时我用2003的时候,偶而连接成功过。不过你说得很有道理,下周到公司的时候,还请你不吝赐教!
      

  13.   

    暂时不要用2005,因为它可能让你遇到一些问题,我就遇到过过服务器的权限问题(FrameWork2.0)
      

  14.   

    试过OleDbConnection没有,我用OracleConnection也连不上,但OleDbConnection可以连上。
      

  15.   

    OleDbConnection我也试过,我是因为2003连接不上才用了2005的,想不到错误提示是一样的。
    TNS:Connection closed.
      

  16.   

    我用的连接自串是这样的
    string s = "Data Source=mydb;uid=myid;pwd=mypwd";
    OracleConnection cn = new OracleConnection(s);
    不过好像你那个也行的,搞不懂
      

  17.   

    各位:
        我在惠普的网站上发现了如下文章,估计这个问题是Oracle的Bug.
    谢谢各位的答复。虽然现在问题没有最终解决,不过我觉得如果以后大家都像这样积极参与,
    那么这个论坛的内容会越来越充实的。因为问题最终没有解决,我就不给各位加分了,请谅解。
    希望以后有机会相见。Bye !
    ==================================================================================
    http://forums1.itrc.hp.com/service/forums/bizsupport/questionanswer.do?admit=716493758+1102949121097+28353475&threadId=38533
    ---------------------------------------------------------------------------------
    Good afternoon all,I've recently encountered a problem with SD4 when running against an Oracle 8.1.7.4.0 database.Although the problem is now resolved, I thought I'd share it with the rest of you in the case you encounter it.Basically, the problem occurs with Oracle 8.1.7.4 SQL*Net. When the CONNECT_DATA string is longer than 800 bytes you may get a "ORA-12537 : TNS Connection Closed" message or similar. Also the SD application server service won't start.You WILL be able to TNSPING and SQLPLUS into the database, but if you use the SD Accounts Wizard and click 'test connection' then it will fail.The problem is an Oracle Bug, Oracle Reference :- #2462125 on Database version 8.1.7.4.0 (26-July-02)The attached file gives the full details of our environment, logserver.txt entries and the contents of the Oracle Bug report.The workaround is basically to reduce the length of the path where Service Desk is installed. The default path of "n:\Program Files\Hewlett-Packard\Service Desk 4.0\Server\bin\" when combined with extended connect_data causes the limit to be exceeded.We reinstalled the application server into n:\APPS\ and it worked fine.In the interests of community spirit and all, I hope you find this useful. 
      

  18.   

    这个问题,原因是oracle 8.1.7.4的bug引起的!
    生成的exe,目录不要太深,就没有问题了!
      

  19.   

    可以先用oracle提供的客户端工具连接服务器试试,如果能连接成功,则表示数据库服务器,客户端没有问题,网络没有问题
    现在就查找是你的程序代码有问题,还是开发工具有问题
    一般来说,开发工具不会连接oracle数据库都有问题就发布了的,特别像MS这种.
      

  20.   

    偶是本机C#+Oracle和楼主一样!!代码应该无问题!!
    楼主把重点放在Oracle的设置吧!