//得到所有的用户信息
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();
}
出现了这样的错误:
说明: 执行当前 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 列名无效的问题,我看别人的源代码也是这么写的,为什么呢?
GetAllUsers方法中DataReader还没关闭你就又调用GetStates方法和getRoles方法时又开启新的DataReader肯定会报错啊。你应该把Users表和UserRoles表以及UserStates表关联起来写成一个sql进行查询。
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" 无效???我不知道为什么??请教了
@木槿花: 你的类属性中没有有那个属性呢?
@木槿花: 你把三个表名用逗号分隔啊,这样写,select * from Users,UserRoles,UserStates 。顺便问一下,UserRoles和UserStates表中都只有一条数据的?
你上面的用了using的就不需要close()了。using会在“}”结束时候,自动进行垃圾回收的。如果要解决你这个问题。最好的办法是在那句话的前面判断一下是否打开了链接,如果没有就打开,如果打开了,就直接创建对象。
真的不好意思,小妹愚笨,不太懂“最好的办法是在那句话的前面判断一下是否打开了链接,如果没有就打开,如果打开了,就直接创建对象“ 这个意思?????请详细一下,谢谢了
@木槿花: 这是最简单的方法:
SqlConnection con=new SqlConnection("");
SqlCommand cmd=new SqlCommand("",con);
con.Open();
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
}
}
如果想用datareader,你那个connection需要是new出来的,不然就是同一个reader。。。(这是我的理解,你自己试试看)
感觉你这个逻辑关系不对吧?
user.UserState = GetStates();
GetStates()是返回所有状态,付给一个用户 ?
user.UserRole = getRoles();
getRoles() 返回所有角色,付给一个用户什么意思 ?
应该是一个用户对应一个角色和一个状态吧 ?