按位/布尔值

时间:2015-06-17 21:59:32

标签: c# sql asp.net sql-server

我正在努力让所有管理员都进入某个系统。我有一个名为bit的{​​{1}}列和一个名为isAdmin的列,它是主键。

我尝试按以下方式选择:

UserID

但是,虽然SELECT * FROM UsersTable WHERE UserID = 2 AND isAdmin = 1 等于UserID的用户不是管理员,但它仍会填充2。我很难用它,我也尝试将DataSetisAdmin进行比较但没有成功。

我如何做到这一点?如何按布尔值(位)值进行过滤?

编辑:

在对我的代码进行另一次审核后,我看到了一些有趣的事情。当我有一个新的'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正在排空然后填充,我想我错了。非常感谢大家。

3 个答案:

答案 0 :(得分:0)

http://sqlfiddle.com/#!9/32721/2

isAdmin应该返回false,而不是0,如果它是布尔值。

编辑:另一个版本。

http://sqlfiddle.com/#!6/067f0e/1

答案 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