先看下出现问题的代码数据访问层有方法GetAll()
{
    ……"select * form messages";
    Ilist<User> list=new List<User>();
    ……
    DataReader reader=Dbhelp.GetReader(sqlStr);    //Dbhelp公用类中有GetReader方法  返回datareader
    while(reader.read())
   {
       User user=new User();   //User是实体类
       user.Id=(int)reader["id"];
       int userStateId=(int)reader["userStateId"];
        ……
        user.UserState=GetUserStateById(userStateId);      //GetUserStateById是根据userStateId返回userState对象  其中用到了dataReader
       list.add(user);
    }
   reader.close();
……
}主要代码如上面所写的 ,这种情况下回 提示datareader未关闭      希望大侠指点下  书本上就这么写的 没有出错 但是我敲出来后就 错了  
先谢谢了

解决方案 »

  1.   

    你得再Connection打开前先关闭数据库的链接
    con.close();
    然后再
    con.open();
      

  2.   

    下面红色部分出现的问题。数据访问层有方法GetAll()
    {
      ……"select * form messages";
      Ilist<User> list=new List<User>();
      ……
      DataReader reader=Dbhelp.GetReader(sqlStr); //Dbhelp公用类中有GetReader方法 返回datareader
      while(reader.read())
      {
      User user=new User(); //User是实体类
      user.Id=(int)reader["id"];
      int userStateId=(int)reader["userStateId"];
      ……
      user.UserState=GetUserStateById(userStateId); //GetUserStateById是根据userStateId返回userState对象 其中用到了dataReader
      list.add(user);
      }
      reader.close();
    ……
    }
      

  3.   

    每个reader使用自己的connection就行了
      

  4.   

    嵌套的reader在每次出嵌套时,是不时都能正确关闭,跟踪下看看。
    注意异常退出的情况
      

  5.   

    DataReader 是只读的切是独占的
    当while 的时候 这个表不能再被别的语句操作
      

  6.   

    看完想说点哈哈 首先不能用同一reader 如果reader里又用了一个,那么得创建两个connection,
    还有reader 用法嘛要谨慎,这种编程法是对客户不负责任,哪天指不定就系统BUG  //如果dr能读到数据
      if (dr.HasRows)
      {
      //循环读取(多个就会循环读取)
      while (dr.Read())
      {
          ...
      }
      }
      dr.Close();//记住你用的DataReader一定要关闭。
    建议用DataAdapter   少用或避免用DataReader