2013-11-26 67 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