2017-03-27 29 views
1

我有一個小問題。如果我的sql請求爲真,我需要隱藏一個按鈕。 我想隱藏管理面板按鈕的用戶,誰不是管理員。我在表格中有一行是「類型」,它有'1'或'2'整數。如果是1這是管理員,如果它是2是用戶。我在某個地方犯錯了。 //如果sql請求爲真,如何隱藏按鈕

  string myConnection = @"Data Source=....."; 
      SqlConnection myConn = new SqlConnection(myConnection); 
      **SqlCommand SelectCommand = new SqlCommand("Select * from dbo.Admin where Type=2 and UserName='" + l1.UserName.Text + "';", myConn);** 
      SqlDataReader myReader; 
      myConn.Open(); 
      int i = SelectCommand.ExecuteNonQuery(); 
      if (i > 0) 
      { 
       **btnAdminPanel.Hide();** 
      } 
+0

這是一個關於SQL或關於隱藏按鈕的問題嗎? – MotKohn

回答

1

對SELECT語句調用ExecuteNonQuery是完全錯誤的。當您希望知道有多少行受到INSERT/UPDATE/DELETE語句(或其他數據定義語言查詢)的影響時,應使用此方法

您應該使用ExecuteReader並檢查讀取器HasRows == True。
但如果你只是想知道如果與指定類型特定的用戶存在,那麼就可以使用,可以通過的ExecuteScalar可以運行不同的查詢文本(返回單個行/列值)

string cmdText = @"IF EXISTS(Select 1 from dbo.Admin 
          where Type=2 and [email protected]) 
          SELECT 1 ELSE SELECT 0"; 
using(SqlConnection myConn = new SqlConnection(myConnection)) 
using(SqlCommand SelectCommand = new SqlCommand(cmdText, myConn)) 
{ 
    myConn.Open(); 
    SelectCommand.Parameters.Add("@user", SqlDbType.NVarChar).Value = l1.UserName.Text; 
    int i = (int)SelectCommand.ExecuteScalar(); 
    if (i > 0) 
    { 
     btnAdminPanel.Hide(); 
    } 
} 

這如果存在滿足條件的記錄,則返回1;如果沒有記錄,則返回零。最好是因爲數據庫會執行這個查詢,因爲知道你只關心記錄的存在而不關注記錄的內容。從客戶端來看,這樣做更好,因爲.NET庫不需要構建SqlDataReader來讀取未知數量的記錄,也不需要檢查空值返回值。

另請注意,我已使用參數傳遞查詢值。如果你想避免黑客用你的代碼拋出一個派對,切勿使用字符串連接。 Sql Iniection基於這種字符串連接方式。

最後一次性使用的物體進入使用區塊,以避免資源泄漏。

+0

喲,你的回答很好,我喜歡它,我現在試過,但它不是按照我想要的方式工作,隱藏這個按鈕btnAdminPanel。 沒有錯誤,但我不明白爲什麼這不起作用因爲它需要理論上的工作。 – BlackStock

+0

您是否嘗試調試此代碼? – Steve

+0

對不起,我在這裏看不到任何問題。現在已經很晚了,好晚安。 – Steve

0

我認爲你應該使用替代的ExecuteNonQuery的ExecuteScalar。 另外,您可以找到here爲SqlCommand提供的不同執行方法之間的差異。

+0

是的。這是解決方案之一。 – BlackStock