2015-06-17 133 views
2

我試圖讓某個系統中的所有管理員。我有一個名爲isAdminbit列和一個名爲UserID的列,它是一個主鍵。按位/布爾值選擇

我試圖通過該位選擇下列方式:

SELECT * FROM UsersTable WHERE UserID = 2 AND isAdmin = 1 

不過,儘管與UserID用戶等於2是不是管理員,但它仍然充滿DataSet它。我很難過,我也試過比較isAdmin'True'沒有成功。

我該如何做到這一點?如何通過布爾(位)值進行過濾?

編輯:

另一次檢討,在我的代碼,我看見有幾個有趣的事情後。當我有了一個新的.aspx.aspx.cs,並且在執行上面提到的同樣的查詢時,它完美地工作 - 它沒有返回一個東西(因爲它應該,因爲用戶num.2不是管理員),當我提到isAdmin = 0,它確實返回它,應該。

但是,對於一些奇怪的原因 - 在另一個文件(實際的應用程序之一)中,完全相同的字符串被執行,但結果是完全不同的。我實際上從數據庫中取回2行。而更瘋狂的部分是,他們都包含相同的用戶(當前在數據庫中的單個管理員),所以我實際上以某種方式得到重複的行......?

這裏是我的代碼和一對夫婦的輸出我測試了它提到:

 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更改爲SELECT * FROM UsersTable WHERE isAdmin = 1時,我得到3行(表中總共有3行),所有這些行都填充了admin行的重複項。這裏會發生什麼?

EDIT2:已解決。實際上,DataSet已經填滿了2行,因爲它是全球性的。我認爲​​是倒空然後填充,我想我錯了。感謝所有人。

+0

驗證您的列定義和值是你所期望的是什麼。從UsersTable中選擇isAdmin,其中UserID = 2;如果它確實是一個布爾值,那麼0應該是false,1應該是true。 – TheMadDBA

+0

你有什麼應該這樣做...所以當你這樣做select語句...它顯示isAdmin值= 0? –

+0

@Damien_The_Unbeliever事實上,這就是問題所在,我只是想到了,因爲我使用的是全球的......非常感謝。 – Zim

回答

0

如果您共享的DataSet身邊,那麼你需要確保你Clear表,如果你想讓它可能是空的。

SqlDataAdapter.Fill的描述:

添加或刷新DataSet中的行。

它沒有說關於刪除現有的行。


另外,請使用Parameters

+0

你是什麼意思的參數?鏈接沒有說太多。 – Zim

+0

@Zim - 而不是'WHERE UserID =「+ Session [」UserID「] +」'你將有'WHERE UserID = @ UserID'。然後,您將添加所需的數據作爲'SqlCommand'對象的參數。這使* code *(SQL)與* data *分開,並且是一個非常好的習慣 - 特別是如果某些數據庫工作接受來自用戶的輸入。參數化是避免[SQL Injection](https://en.wikipedia.org/wiki/SQL_injection)這一最大類安全漏洞的關鍵技術。 –

0

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

isAdmin應該返回假,不爲0,如果是布爾值。

編輯:另一個版本。

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

+0

我相信是MySQL語法,而不是SQL Server。 –

+0

@BrianPressler你是對的,這是我的一個疏忽。我將版本更改爲MS SQL SERVER 2014,結果告訴我同樣的事情。編輯我的帖子,以反映這一點。 – TRose

+0

我的意思是「Where isAdmin = false」是無效的SQL Server語法。 「False」這個詞不是一個SQL Server關鍵詞,如果你嘗試以這種方式使用它,你會得到一個語法錯誤。 –

0

我看不出有什麼不對您發佈的查詢,但與你在您的文章說,我懷疑你用了OR條件,而不是像AND

SELECT * FROM UsersTable WHERE UserID = 2 OR isAdmin = 1 

你可以試着改變你的查詢關鍵詞,比如下面這將只取回誰也管理員有用戶。

SELECT * FROM UsersTable WHERE isAdmin = 1 
+0

請注意,我更新了帖子 – Zim