class1
public static SqlDataReader ExecuteReader(string cmdText,commandbehavior cb)
{
   SqlConnection conn = new SqlConnection();
   conn.ConnectionString = "连接字符串";
   conn.open();
   try
   {
      SqlCommand cmd = new SqlCommand();
      cmd.Connection = conn;
      cmd.CommandText = cmdText;
      return cmd.executereader(cb);
   }
   catch
   {
      conn.close();
      throw;
   }
}调用
using(SqlDataReader sdr=class1.ExecuteReader(strSql,commandbehavior.closeconnection))
{
   while(sdr.read())
   {
     //处理....
   }
   if(!sdr.isclose) sdr.close();
}手上没源码,代码手写的,,可能有个别错误在class1.ExecuteReader方法中也没有关闭conn
问题:偶尔会出现   阅读器关闭时READ的尝试无效   错误

解决方案 »

  1.   

    using 关键字有两个主要用途:作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型。请参见 using 指令。作为语句,用于定义一个范围,在此范围的末尾将释放对象。请参见 using 语句。直接试下 sdr.close();
      

  2.   

    to:liujia_0421
    不想做太多的重复工作,class1作为一个基本操作的方法
      

  3.   

    to:liujia_0421
    是啊,,只是偶尔会出现,,
      

  4.   

    public static SqlDataReader ExecuteReader(string cmdText,CommandBehavior cb)
    {
       SqlConnection conn = new SqlConnection();
       conn.ConnectionString = "连接字符串";
       try
       {
           conn.Open();
           SqlCommand cmd = new SqlCommand();
           cmd.Connection = conn;
           cmd.CommandText = cmdText;
           return cmd.ExecutRreader(cb);
       }
       catch
       {
           if (conn.State == System.Data.ConnectionState.Open)
               conn.Close();
           throw;
       }
    }调用
    首先建一个和数据库对应的实体类,
    public ArrayList getlist()
    {
        ArrayList list = new list();
        string strSql = "select 列1,列2,列3 from table1";
        using(SqlDataReader sdr=class1.ExecuteReader(strSql,CommandBehavior.CloseConnection))
        {
    while(sdr.read())
    {
         实体类 m = new 实体类();
         m.列1=sdr.getValue(0).ToString();
         m.列2=sdr.getValue(1).ToString();
         m.列3=sdr.getValue(2).ToString();
         list.add(m);
    }
    if(!sdr.IsClosed)sdr.Close();
        }
        return list;
    }是在vs.net2003下的,代码没什么技术性的东西,手上现在也没源码,不过代码大概也就是这样的, 因为出现这种错误的地方也不指一处,只要用到while(sdr.read())就有可能会出现这样的错误,如果只指读一行的话,就没出现过这样错误
      

  5.   

    用了using ,SqlDataReader会自己关闭的.
      

  6.   

    看了一下,如果你的public static SqlDataReader ExecuteReader中如果出现异常(别的异常)的话,就会执行:
    if (conn.State == System.Data.ConnectionState.Open)
    conn.Close();
    这时候返回Reader时,连接是关闭的,就会抛出"阅读器关闭时READ的尝试无效 "的异常...试着这样改下:public static SqlDataReader ExecuteReader(string cmdText, CommandBehavior cb)
            {
                SqlConnection conn = new SqlConnection();
                conn.ConnectionString = "server=.;database=student;uid=sa;pwd=0421";
                try
                {
                    conn.Open();
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = conn;
                    cmd.CommandText = cmdText;
                    return cmd.ExecuteReader(cb);
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
    ArrayList list = new ArrayList();
                string strSql = "select * from studentDetails";
                try
                {
                    using (SqlDataReader sdr = ExecuteReader(strSql, CommandBehavior.CloseConnection))
                    {
                        while (sdr.Read())
                        {
                            list.Add(sdr["sname"].ToString());
                        }
                        if (!sdr.IsClosed) sdr.Close();
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
      

  7.   

    to:winner2050(winner)
    我之前也是没加if(!sdr.IsClosed)sdr.Close(),发现性能不太好,还是自己手动关一下好点,再者加那句,也是read完之后的,那也就不会抛出那个错误
    to:liujia_0421(SnowLover)
    问题是:刷新一下就不会出现了
    而且sqlconnection也只是在出错时才关闭就是出错了,那也就是抛出一个sql错误,抛出错误了,就不会再去read()的了吧!
    为什么刷新一下,就不会错的呢!
      

  8.   

    类似
    using(SqlDataReader sdr=class1.ExecuteReader(strSql,commandbehavior.closeconnection))
    这样的USING的用法,括号里的资源在语句结束之后会自动释放资源,所以,
    上面的SDR会自动关闭释放掉,但是你的CON不在此语句自动释放之类,你自己研究下
      

  9.   

    to:wslinfeng(林风)
    commandbehavior.closeconnection:当sqldatareader释放掉了之后,就会关闭掉sqlconnection
      

  10.   

    最后不好试图在 using 里面关闭 sqldatareader
      

  11.   

    to:sprider(人黑牙黄)
    我原本也是没在using里面关闭sqldatareader的,但那也会出现这种错误的
    我想会发生这种错误,也不关我在using里关闭sqldatareader的事
      

  12.   

    commandbehavior.closeconnection他会在READ用完后,关闭连接,你可以看一下帮助
      

  13.   

    to:honkerhero() 
    commandbehavior.closeconnection
    只在关闭 DataReader 对象,则关联的 Connection 对象也将关闭而不是read完之后,就去关掉Connection对象
    再者我是在while(sdr.read())这个循环完之后(也就是read完了)才关闭sqldatareader对象using()内的对象(也就是sqldatareader)也会自动调用Dispose方法,只不过我自己在用完之后就关闭掉sqldatareader对象
      

  14.   

    难道只能用SQLDataAdapter了吗??
    那样的话就得改死人了有没有帮忙处理一下的高手???
      

  15.   

    commandbehavior.closeconnection他会在READ用完后,关闭连接,你可以看一下帮助这句话是对的,但是用在USING里面,后果难说啊,最好不要这样写
      

  16.   

    第一次调用 应该不报错,第二次调用时,会报错。原因:没有con.close();
      

  17.   

    SqlConnection conn =null;
    SqlDataReader sdr= null;
    using()
    {
       conn = new SqlConnection();
       conn.ConnectionString = "连接字符串";
       conn.open();
       try
       {
          SqlCommand cmd = new SqlCommand();
          cmd.Connection = conn;
          cmd.CommandText = cmdText;
          sdr = cmd.executereader(cb);
          while(sdr.read())
          {
               //处理....
          }
        }
        finally
        {
     if (conn.State == System.Data.ConnectionState.Open)
               conn.Close();    }}
      

  18.   

    to:wslinfeng(林风)
    什么才叫read用完??
    只有关闭了sqldatareader对象时,关联的sqlconnection对象也将关闭
    to:fwqfwq() 
    sqlconnection对象关闭了的,你可以去看看关于commandbehavior.closeconnection的帮助