2014-01-27 35 views
0

我正在嘗試創建一個登錄程序,用於檢查用戶輸入的用戶名和密碼是否保存在數據庫中。出於某種原因,該程序的「if(dr.HasRows)」部分不起作用。當我嘗試沒有嘗試抓住,我得到和錯誤「可能錯誤的空聲明」。我做錯了什麼?使用本地SQL數據庫登錄程序

SqlConnection Connection = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\Logins.mdf;Integrated Security=True"); 

try 
{ 
    Connection.Open(); 
    MessageBox.Show("Connection Succesful"); 

    if (Connection != null && Connection.State == ConnectionState.Closed); 

    SqlCommand cmd = new SqlCommand("SELECT Count(*) FROM Logins WHERE Username='" + txtUsername.Text + "' and Password='" + txtPassword.Text + "'", Connection); 
    SqlDataReader dr = cmd.ExecuteReader(); 

    if (dr.HasRows) 
    { 
     MessageBox.Show("Login Success"); 
    } 
    else 
    { 
     MessageBox.Show("Incorrect login"); 
    } 
} 
catch (Exception) 
{ 
    MessageBox.Show("Connection Unsuccesful"); 
} 

回答

7

此行

if (Connection != null && Connection.State == ConnectionState.Closed); 

包含分號引起的警告,但你必須剛剛打開連接,添加此檢查的目的是什麼?

再就是引起你的字符串連接的Sql Injection和分析問題

我會更改您的代碼

using(SqlConnection Connection = new SqlConnection(....)) 
{ 
    try 
    { 
     Connection.Open(); 
     SqlCommand cmd = new SqlCommand(@"SELECT Count(*) FROM Logins 
             WHERE [email protected] and 
             [email protected]", Connection); 
     cmd.Parameters.AddWithValue("@uname", txtUsername.Text); 
     cmd.Parameters.AddWithValue("@pass", txtPassword.Text); 
     int result = (int)cmd.ExecuteScalar(); 
     if(result > 0) 
      MessageBox.Show("Login Success"); 
     else 
      MessageBox.Show("Incorrect login"); 
    } 
    catch(Exception ex) 
    { 
     MessageBox.Show("Unexpected error:" + ex.Message); 
    } 
} 

參數化方法是安全的,因爲它避免了SQL注入問題,然後繼續工作正確引用您的值到框架代碼。此外,命令文本更具可讀性。

我也將您的代碼從ExecuteReader更改爲ExecuteScalar,因爲您只需檢索查詢返回的第一行的第一列,並且不需要SqlDataReader。

而我需要說的最後一件事是:捕捉異常只是爲了說失敗並不是一個好習慣。至少,告訴你的用戶什麼是錯誤。使用MessageBox.Show("Unexpected error: " + ex.Message)

編輯好抱歉,但我有另一個。以明文存儲密碼確實是一個很大的安全問題。正確的做法是將密碼和apply the hashing function的哈希值存儲到用於傳遞密碼的參數中,這樣只有哈希結果沿着網絡傳輸,並且如果有人設法竊取數據庫,將很難回覆到明確的值

+1

在查詢的末尾添加雙引號;) – Abbas

+0

@Abbas謝謝 – Steve

+0

這就解決了我的問題,謝謝你 – user2840120

4

可能的空語句是:

if (Connection != null && Connection.State == ConnectionState.Closed); 

;在年底使if語句沒有意義的。

在另一個注意事項上,您應該使用Parameters將您的參數不直接粘貼到查詢中,以防止SQL注入攻擊。

說了這麼多,你if (dr.HasRows)聲明應該仍然正常工作,假定連接實際上是有效等