我正在努力让所有管理员都进入某个系统。我有一个名为bit
的{{1}}列和一个名为isAdmin
的列,它是主键。
我尝试按以下方式选择:
UserID
但是,虽然SELECT * FROM UsersTable WHERE UserID = 2 AND isAdmin = 1
等于UserID
的用户不是管理员,但它仍会填充2
。我很难用它,我也尝试将DataSet
与isAdmin
进行比较但没有成功。
我如何做到这一点?如何按布尔值(位)值进行过滤?
编辑:
在对我的代码进行另一次审核后,我看到了一些有趣的事情。当我有一个新的'True'
和.aspx
并且在执行上面提到的相同查询时,它完美地工作 - 它没有返回一个东西(因为它应该,因为用户数量为2。不管是管理员吗?当我提到.aspx.cs
时,它确实应该返回它。
但是,出于一些奇怪的原因 - 在另一个文件(实际应用程序之一)中,执行完全相同的字符串,但结果却完全不同。我实际上从数据库中获得了2行。更疯狂的部分是它们两个包含相同的用户(当前在数据库中的单个管理员),所以我实际上以某种方式得到一个重复的行......?
这是我的一段代码和我在其中提到的一些输出:
isAdmin = 0
这是我的代码块,我的应用程序不是多线程的,访问它时也没有人访问 SqlConnection conn = new SqlConnection(/*My Connection String, identical in all files*/);
cmd.CommandText = "SELECT * FROM UsersTable WHERE UserID = " + Session["UserID"] + " AND isAdmin = 1"; //I put the output in an alert message box - OUTPUT: SELECT * FROM UsersTable WHERE UserID = 2 AND isAdmin = 1 (as expected). Note that this whole chunk is in a 'if(Session["UserID"] != null)'.
cmd.Connection = conn;
conn.Open();
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
adapter.Fill(u);
conn.Close();
if (u.Tables[0].Rows.Count > 0) //u.Tables[0].Rows.Count == 2, how is that?
{
Response.Write("<script>alert('" + u.Tables[0].Rows[0]["Username"] + ", " + u.Tables[0].Rows[1]["Username"] + "');</script>"); //This, for instance, outputs - 'admin', 'admin' (note there's only one user with the username - 'admin' and he is an administrator.
/* Here I'm doing some things exclusively for the admin */
}
。这个问题真的让我很烦恼,因为我觉得没有理由让它发生。
注意:当我实际将u
更改为cmd.CommandText
时,我得到3行(表中总共有3行),所有这些行都填充了{{1}的副本行。这会发生什么?
EDIT2:解决了。事实上,SELECT * FROM UsersTable WHERE isAdmin = 1
已经填充了2行,因为它是全局的。我认为admin
正在排空然后填充,我想我错了。非常感谢大家。
答案 0 :(得分:0)
答案 1 :(得分:0)
我发布的查询没有看到任何问题,但是您在帖子中说了什么;我怀疑您使用的是OR
条件,而不是AND
SELECT * FROM UsersTable WHERE UserID = 2 OR isAdmin = 1
您可以尝试更改下面的查询,这样只能获取同时也是管理员的用户。
SELECT * FROM UsersTable WHERE isAdmin = 1
答案 2 :(得分:0)
如果您要分享DataSet
,那么您需要确保Clear
表格,如果您希望它可能为空。
请注意SqlDataAdapter.Fill
的说明:
在DataSet中添加或刷新行。
它没有说明删除现有行。
另外,请使用Parameters