我有一个包含用户名和密码列表的表,我希望将用户输入的用户名和密码与保存在数据库中的用户名和密码相匹配。我使用的代码只检索users表中第一条记录的登录信息,如何更改,以便代码适用于所有用户。
我是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 :(得分:2)
关键是SQL查询,特别是WHERE子句:
SELECT UserPassword FROM tblLoginProject
此查询将返回数据库中的所有密码。但是您只想检索一个用户的密码,因此需要实现WHERE子句
SELECT UserPassword FROM tblLoginProject WHERE UserName = @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(有效登录)。
接下来你应该研究散列密码。在那之后将腌制这些哈希。祝你好运!
答案 1 :(得分:1)
将查询更改为:
cmd.CommandText = "SELECT UserPassword FROM tblLoginProject WHERE UserName = @username";
然后设置该参数值:
cmd.Parameters.AddWithValue("@username", tbxUserName.Text);
这将为您找到您正在寻找的用户的行。现在再提几点建议。 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
语句来确保对象被处置。