你先把connection.dispose()删除掉.就connection.close().
cmd.CommandText=proc_name;
cmd.CommandType=CommandType.StoredProcedure;
cmd.Connection=new  clsPublic().ConnectDB();.....
try
{
cmd.ExecuteNonQuery();
ii=(int)cmd.Parameters["p_out"].Value;
}
catch
{
ii= -3;
}
finally
{
if (cmd.Connection.State==ConnectionState.Open)
{
cmd.Connection.Close();
cmd.Dispose();
}
}
return ii;
}

解决方案 »

  1.   

    connection.Close()和connection.Dispose()有什么区别么?
      

  2.   

    if (cmd.Connection.State==ConnectionState.Open)
    {
        cmd.Connection.Close();
        cmd.Dispose();
    }--connection.close()只是关闭了联结.而dispose()则释放了该connection所占用的资源.
      

  3.   

    connection.Close()是断开数据库的连接
    connection.Dispose()是销毁数据库连接的变量
      

  4.   

    connection.close()只是关闭了联结.
    dispose()则释放了该connection所占用的资源.
      

  5.   

    我换成Close()了,但是还是有问题。因为我要通过一个循环来判断许多Oracle连接的连通状况,方法就是先创建一个连接,再尝试打开。但我发现在判断某些连接时,似乎Oracle的服务器不响应,还生成了一个叫sqlnet.log的文件,里面的内容如下:
    ********************************************
    Fatal NI connect error 12560,connecting to:
    (DESCRIPTION=(ADDRESS=(PROTOCOL=BEQ)(PROGRAM=oracle)(ARGV0=oracleORCL)
    (ARGS='(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=BEQ)))'))(CONNECT_DATA=(SID=ORCL)
    (CRD=PROGRAM=……)(HOST=……)(USER=Administrator))))VERSION INFORMATION:
       TNS for 32bit Windows: Version 8.1.6.0.0 -
         Production Oracle Bequeath NT Protocol Adapter for 32-bit Windows: Version 8.1.6.0.0
         Production Windows NT TCP/IP NT Protocol
      

  6.   

    Windows NT TCP/IP NT Protocol Adapter for 32-bit Windows: Version 8.1.6.0.0 - Production
      Time: 24-8月 -2004 16:32:08
      Tracing not turned on.
      Tns error struct:
        nr err code: 0
        ns main err code: 12560
        TNS-12560: TNS:协议适配器出现错误
        ns secondary err code: 0
        nt main err code: 530
        TNS-00530: 协议适配器错误
        nt secondary err code: 126
        nt OS err code: 0
      

  7.   

    private string connectstring="Provider=MSDAORA.1;Password=密码;User ID=用户;Data Source=数据库;Persist Security Info=True";
    private OleDbCommand cmd=new OleDbCommand(); #region 连接数据库
    public OleDbConnection ConnectDB() 
    {
    OleDbConnection conn=new OleDbConnection();
    conn.ConnectionString=connectstring;
    conn.Open();
    return conn;
    }
    #endregion
    调用上面返回一个联结.然后在前端执行的时候判断, public int Execute_proc_user(string flag,int p_user_id,string p_login_name,string p_password,string p_name,int p_power_id,string p_power_name,string p_telephone,string p_email,string proc_name)
    {
    cmd.Parameters.Clear();
    cmd.Dispose();
    int ii;
    string p_flag=flag;
    cmd.CommandText=proc_name;
    cmd.CommandType=CommandType.StoredProcedure;
    cmd.Connection=new  clsPublic().ConnectDB(); cmd.Parameters.Add("p_flag",OleDbType.VarChar);
    .....                cmd.Parameters["p_out"].Direction=ParameterDirection.ReturnValue;
    try
    {
    //你可以在这里判断连接断开情况,
    if (cmd.connection.State==ConnectionState.Open)
    {
        //执行操作.
    }
    同一个cmd.connection,执行完成之前不要关闭.
    cmd.ExecuteNonQuery();
    ii=(int)cmd.Parameters["p_out"].Value;
    }
    catch
    {
    ii= -3;
    }
    //这里执行完成了以后关闭联结.
    finally
    {
    if (cmd.Connection.State==ConnectionState.Open)
    {
    cmd.Connection.Close();
    cmd.Dispose();
    }
    }
    return ii;
    } #endregion
      

  8.   

    先谢谢楼上的dinya2003(OK)!写了这么一大堆,呵呵^_^
    你的意思我基本明白了,我发现很多人在结束数据库调用的时候总是先Close(),再Dispose(),这样做是有道理的吧?
    另外关于我的问题,因为我测的是许多单位的Oracle数据库连通情况,而这些单位中有一些据我所知是装了防火墙的,这会不会是导致我执行到conn.Open()时死掉的原因呢?