首页 新闻 会员 周边 捐助

DataReader未关闭,纠结的问题,求解,急急急

0
悬赏园豆:10 [待解决问题]

  //得到所有的用户信息
        public static IList<Users> GetAllUsers()
        {
            string sql = "select * from  Users ";
            IList<Users> list=new List<Users>();
            using (SqlDataReader dr =DBhelper.GetReader(sql,null))
            {
                while (dr.Read())
                {
                    Users user = new Users();
               
                    user.Phone = dr["Phone"].ToString();
                    user.Mail = dr["Mail"].ToString();
                    user.Address = dr["Address"].ToString();

                    user.LoginId = dr["LoginId"].ToString();
                    //UserStates us = new UserStates();
                  //下面要注意,返回的是对象
                             user.UserState = GetStates();

                      ////下面要注意,返回的是对象

                    user.UserRole = getRoles();

                      list.Add(user);
                }
                dr.Close();
                return list;
           
            }

       
        }
        //返回一个角色的对象
        private static UserRoles getRoles()
        {
            string sql = "select * from UserRoles";
            UserRoles role = new UserRoles();
            using (SqlDataReader dr = DBhelper.GetReader(sql, null))
            {
                while (dr.Read())
                {
                    role.Id = (int)dr["Id"];
                    role.Name = (string)dr["Name"];
                    //userRole.Add(role);

                }
                dr.Close();
                return role;
            }
        }
         //返回一个状态的对象
        private static UserStates GetStates()
        {
            string sql = "select * from UserStates";

            UserStates state = new UserStates();
            using (SqlDataReader dr = DBhelper.GetReader(sql, null))
            {
                while (dr.Read())
                {
                    state.Id = (int)dr["Id"];
                    state.Name = (string)dr["Name"];
                    //userRole.Add(role);

                } dr.Close();
                return state;
               
            }
        }

 

 

注:DBhelper 中调用的方法:

  public static SqlDataReader GetReader(string sql, SqlParameter[] values)
        {


            SqlCommand command = new SqlCommand(sql, Connection);
            if (values != null)
            {
                command.Parameters.AddRange(values);
            }

            return command.ExecuteReader();
        }

 

出现了这样的错误:

已有打开的与此命令相关联的 DataReader,必须首先将它关闭。

说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.InvalidOperationException: 已有打开的与此命令相关联的 DataReader,必须首先将它关闭。

源错误:

行 45:             }行 46: 行 47:             return command.ExecuteReader();行 48:         }行 49: 


源文件: E:\MyMessageTest\MyMessageTest.DAL\DBhelper.cs    行: 47

问题补充:

       问题补充,我想讲三个表连在一起写,

  string sql = "select * from  vw_Users_UserStates_UserRoles";
            IList<Users> list = new List<Users>();
            using (SqlDataReader dr = DBhelper.GetReader(sql, null))
            {
                while (dr.Read())
                {
                    Users user = new Users();
                    user.Id = (int)dr["Id"];
                    user.Name = dr["Name"].ToString();
                    user.Address = dr["Address"].ToString();
                    user.Postalcode = dr["Postalcode"].ToString();
                                      UserStates us = new UserStates();
                    us.Id = (int)dr["USId"];
                    us.Name = dr["USName"].ToString();
                    user.UserState = us;
                                      user.LoginId = dr["LoginId"].ToString();
                    user.LoginPwd = dr["LoginPwd"].ToString();
                    ////////
                    UserRoles ur = new UserRoles();
                    ur.Id = (int)dr["URId"];
                    ur.Name = dr["URName"].ToString();
                    user.UserRole = ur;
                                  }
            }
            return list;
         
        }  但是出现  vw_Users_UserStates_UserRoles 列名无效的问题,我看别人的源代码也是这么写的,为什么呢?

木槿花的主页 木槿花 | 初学一级 | 园豆:109
提问于:2011-12-11 10:13
< >
分享
所有回答(4)
0

GetAllUsers方法中DataReader还没关闭你就又调用GetStates方法和getRoles方法时又开启新的DataReader肯定会报错啊。你应该把Users表和UserRoles表以及UserStates表关联起来写成一个sql进行查询。

LCM | 园豆:6876 (大侠五级) | 2011-12-11 10:30

string sql = "select * from  vw_Users_UserStates_UserRoles";
            IList<Users> list = new List<Users>();
            using (SqlDataReader dr = DBhelper.GetReader(sql, null))
            {
                while (dr.Read())
                {
                    Users user = new Users();
                    user.Id = (int)dr["Id"];
                    user.Name = dr["Name"].ToString();
                    user.Address = dr["Address"].ToString();
                                       UserStates us = new UserStates();
                    us.Id = (int)dr["USId"];
                    us.Name = dr["USName"].ToString();
                    user.UserState = us;
                                      user.LoginId = dr["LoginId"].ToString();
                    user.LoginPwd = dr["LoginPwd"].ToString();
                    ////////
                    UserRoles ur = new UserRoles();
                    ur.Id = (int)dr["URId"];
                    ur.Name = dr["URName"].ToString();
                    user.UserRole = ur;
                    /////
                                    list.Add(user);
                }
            }
            return list;
         
        }

 

我也想过把它们连在一起写,这是我在网上看到别人连在一起写的代码,我模仿了一下,在我的电脑上编译出现"select * from  vw_Users_UserStates_UserRoles" 无效???我不知道为什么??请教了

支持(0) 反对(0) 木槿花 | 园豆:109 (初学一级) | 2011-12-11 10:37

@木槿花: 你的类属性中没有有那个属性呢?

支持(0) 反对(0) 悟行 | 园豆:12559 (专家六级) | 2011-12-11 10:49

@木槿花: 你把三个表名用逗号分隔啊,这样写,select * from  Users,UserRoles,UserStates     。顺便问一下,UserRoles和UserStates表中都只有一条数据的?

支持(0) 反对(0) LCM | 园豆:6876 (大侠五级) | 2011-12-11 10:59
0

你上面的用了using的就不需要close()了。using会在“}”结束时候,自动进行垃圾回收的。如果要解决你这个问题。最好的办法是在那句话的前面判断一下是否打开了链接,如果没有就打开,如果打开了,就直接创建对象。

悟行 | 园豆:12559 (专家六级) | 2011-12-11 10:32

  真的不好意思,小妹愚笨,不太懂“最好的办法是在那句话的前面判断一下是否打开了链接,如果没有就打开,如果打开了,就直接创建对象“ 这个意思?????请详细一下,谢谢了

支持(0) 反对(0) 木槿花 | 园豆:109 (初学一级) | 2011-12-11 10:50

@木槿花: 这是最简单的方法:

SqlConnection con=new SqlConnection("");
SqlCommand cmd=new SqlCommand("",con);
con.Open();
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{

}
}

支持(0) 反对(0) 悟行 | 园豆:12559 (专家六级) | 2011-12-11 11:11
0

如果想用datareader,你那个connection需要是new出来的,不然就是同一个reader。。。(这是我的理解,你自己试试看)

顾晓北 | 园豆:10898 (专家六级) | 2011-12-11 11:58
0

感觉你这个逻辑关系不对吧?

user.UserState = GetStates();

GetStates()是返回所有状态,付给一个用户 ?

user.UserRole = getRoles(); 

getRoles() 返回所有角色,付给一个用户什么意思 ?

 

应该是一个用户对应一个角色和一个状态吧 ?

卒子 | 园豆:588 (小虾三级) | 2011-12-11 19:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册