我在一个类SQLconn里面申明了一个SqlDataReader,即SQLconn.SqlDr,SQLconn有一个方法返回一个SqlDataReader给SQLconn.SqlDr。现在有这样一个问题想问一下,就是我在一次read()用完这个SQLconn.SqlDr以后是不是要Dispose()掉,Dispose()掉以后下次还要将返回值给SQLconn.SqlDr时候可以,还是要重新申明?谢谢

解决方案 »

  1.   

    用完就关、
    下次用就再开。你这个逻辑有问题吧?
    我都看不明白。如果你是写了一个方法返回一个SqlDataReader,那么每次用的时候都先定义一个SqlDataReader来接收他的返回值。
      

  2.   

    你在重新说一边,到底和DataReader有什么关系
      

  3.   

    不需要dispose
    先定义一个sqlreader
    然后你的方法执行了返回值付给它
    然后close
    下次再返回直接赋值给它不需要再用它了,dispose
      

  4.   

    是这样的
    我需要在其他的地方引用SQLconn这个类,SQLconn里有一个查询的方法,SQLconn.sqlselect,这个类返回一个SqlDataReader
    public class SQLconn
        {
            private SqlDataReader _sqldatareader;
            public Sqlselect()
            {
                _conn.ConnectionString = "server=" + _servername + ";database=" + _dbname + ";uid=" + _uid + ";pwd=" + _password;
               _sqlcmd.CommandText=_cmdstr;
               _conn.Open();
               _sqlcmd.Connection=_conn;
               _sqldatareader=_sqlcmd.ExecuteReader();
               _sqlcmd.Dispose();
               _conn.Close();                
               return _sqldatareader;
            }
    }
    这个类跟这个帖子的主题有关的部分是这样的,SQLconn.sqlselect这个方法不是直接返回一个SQLDataReader,因为这个SQLDataReader是需要使用完以后在Sqlselect方法里dispose掉的,所以我另外申明了一个_sqldatareader用来获得返回值
    现在的问题是,main里面需要调用SQLconn.sqlselect(),SQLDataReader dr=new SQLDataReader();
    SQLconn.sqlselect();
    dr=SQLconn._sqldatareader;
    这样以后我是不是需要把这个SQLconn._sqldatare dispose掉,这个_sqldatareader以后是还要用的
      

  5.   

    我理解dispose和close不一样的,
    dispose是完全释放了资源
    close是将释放连接,而且把资源返回连接池
    我理解上面我看的不是很懂,我觉得是否可以用using语句呢
    也可以释放资源啊
      

  6.   

    public class SQLconn
        {
            //去掉private SqlDataReader _sqldatareader;
            public static IDataReader Sqlselect()
            {
                _conn.ConnectionString = "server=" + _servername + ";database=" + _dbname + ";uid=" + _uid + ";pwd=" + _password;
              _sqlcmd.CommandText=_cmdstr;
              _conn.Open();
              _sqlcmd.Connection=_conn;
              SqlDataReader reader= cmd.ExecuteReader(CommandBehavior.CloseConnection);//替换掉这句_sqlcmd.ExecuteReader();
              //去掉_sqlcmd.Dispose();
              //去掉_conn.Close();               
              return reader;
            }

    使用的时候
    using(IDataReader dr = SQLconn.Sqlselect())
    {
        //操作
    }
      

  7.   

    按你的理解用完DataReader以后是不能使用Dispose的,因为连接没有返回连接池,下载链接还要重连
      

  8.   


    你这里的reader不需要释放吗?
      

  9.   

    using(IDataReader dr = SQLconn.Sqlselect())
    {
        //操作
    } 释放了
    注意下这句 SqlDataReader reader= cmd.ExecuteReader(CommandBehavior.CloseConnection);//替换掉这句_sqlcmd.ExecuteReader(); CommandBehavior.CloseConnection 会随着DataReader的关闭而关闭它所关联的Conn对象的。你如果看过微软出的Data Access Building Block 里面就是这样用的
      

  10.   

    这样啊
    那就是说这个reader是会自动释放的?
    还有问题,就是_sqlcmd和_conn是不是不需要关闭
    关闭的话是不是以后就不能再用了
      

  11.   

    CommandBehavior.CloseConnection 会随着DataReader的关闭而关闭它所关联的Conn对象的。
    =======================================================
    所以 _conn不需要关,会自动关sqlcmd 我从来就没管过,它不涉及数据库连接不用管它
      

  12.   

    CommandBehavior是不是需要申明的?
    是什么东东
    没用过呢