2013-11-26 66 views
1

我有一張表,其中包含用戶名和密碼列表,我想將用戶輸入的用戶名和密碼與保存在數據庫中的用戶名和密碼相匹配。我正在使用的代碼僅檢索用戶表中第一條記錄的登錄信息,如何更改該代碼以便代碼適用於所有用戶。從數據庫檢索用戶密碼

我在VS一個初學者,我想學的基礎知識,以便稍後我將與加密來實現更加複雜的登錄頁面。謝謝

private void btnLogin_Click(object sender, EventArgs e) 
    { 
     SqlConnection cn = new SqlConnection(); 
     SqlCommand cmd = new SqlCommand(); 
     SqlDataReader dr; 

     cn.ConnectionString = "Server=;Database=;User Id=naljalid;Password="; 
     cmd.Connection = cn; 
     string username = tbxUserName.Text; 
     cmd.CommandText = "SELECT UserPassword FROM tblLoginProject WHERE UserName=username"; 

     // open a connection to DB 
     cn.Open(); 

     //read the table 
     dr = cmd.ExecuteReader(); 

     //read a record from te data reader 
     dr.Read(); 

     // compare the passwords 


     if (tbxPassword.Text == dr.GetString(0)) 
     { 
      MessageBox.Show("Hello"); 
     } 

     else 
     { 
      MessageBox.Show("Login failed, please re-enter your password"); 
     } 
    } 
+0

如果只有一個用戶登錄,您爲什麼要加載所有用戶?只要刪除WHERE子句,並將結果存儲在應用程序某處的容器中,如果這是您想要的。 – OldProgrammer

回答

1

更改查詢tidge這樣的:

cmd.CommandText = "SELECT UserPassword FROM tblLoginProject WHERE UserName = @username"; 

然後設置參數值:

cmd.Parameters.AddWithValue("@username", tbxUserName.Text); 

,將讓你的行FO r你正在尋找的用戶。現在再提出一些建議。 ADO.NET類實現了IDispoable接口。該接口標識該類使用了一些非託管資源。你想確保那些被處置。考慮你當前的代碼的改寫如下:

using (SqlConnection cn = new SqlConnection("Server=;Database=;User Id=naljalid;Password=")) 
using (SqlCommand cmd = new SqlCommand("SELECT UserName FROM tblLoginProject WHERE UserName = @username AND Password = @password", cn)) 
{ 
    cn.Open(); 

    cmd.Parameters.AddWithValue("@username", tbxUserName.Text); 
    cmd.Parameters.AddWithValue("@password", tbxPassword.Text); 

    var result = cmd.ExecuteScalar() as string; 
    if (string.IsNullOrEmpty(result)) 
    { 
     // user was not found 
    } 
    else 
    { 
     // user was found 
    } 
} 

它利用using聲明,以確保對象得到處置。

+1

非常感謝你終於成功了:) – nj2012

2

的關鍵,這是SQL查詢,特別是在WHERE子句:

SELECT UserPassword FROM tblLoginProject 

這個查詢將返回所有的密碼從數據庫中。但是,要檢索只有一個用戶的密碼,所以你需要實現一個WHERE子句

SELECT UserPassword FROM tblLoginProject WHERE UserName = @username 

這個查詢只能在一定用戶找回密碼的地方領域用戶名的值等於傳入的值參數@username。所以現在我們需要確保傳遞這個價值。你不能只是像你現在正在做的那樣將它包含在SQL查詢中。我們這樣做是這樣的:

cmd.Paramateres.AddWithValue("@username", username); 

這應該做工精細,但爲了達到最佳的實踐,你應該檢查同時包含用戶名密碼:

SELECT count(*) FROM tblLoginProject WHERE UserName = @username AND UserPassword = @password 

然後,當然,我們同時通過值:

cmd.Paramateres.AddWithValue("@username", username); 
cmd.Paramateres.AddWithValue("@password", password); 

這將返回0,如果沒有用戶輸入用戶名和密碼(無效登錄),或大於0,如果這樣的AU的該組合發現ser被發現(有效登錄)。

下一站你應該研究哈希密碼。之後會醃製這些哈希。祝你好運!

+0

非常感謝你的幫助 – nj2012