我目前正在开发一个项目,该项目要求我创建一个登录页面,该页面查看用户输入,并将其与数据库中的值进行比较。更具体地说,是用户名和密码。 这就是我的代码的样子:
public static void Login(string user, string pass)
{
var con = GetConnection();
try
{
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = con;
cmd.CommandText = "SELECT username, password FROM user_data;";
MySqlDataReader reader = cmd.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
string un = reader.GetString(0);
string pw = reader.GetString(1);
if (user == un && pass == pw)
{
MessageBox.Show("Welcome");
con.Close();
reader.Close();
}
else if (user != un && pass == pw)
{
MessageBox.Show("Username is incorrect");
reader.Close();
}
else if (user == un && pass != pw)
{
MessageBox.Show("Password is incorrect");
reader.Close();
}
}
}
}
catch (Exception e)
{
con.Close();
MessageBox.Show(Convert.ToString(e));
}
finally
{
con.Close();
}
}
这里是调用该方法的地方:
private void button1_Click(object sender, EventArgs e)
{
Login(textBox1.Text, textBox2.Text);
}
它的作用是获取用户输入,并将该信息与我的数据库中的数据进行比较。问题在于,按照它的编程方式,它首先查看表的第一行(从中获取用户名和密码)并检查信息是否与用户输入匹配。 如果是这样,用户会看到一个弹出窗口,告诉他们欢迎。如果用户名或密码错误,系统会提示用户。
如果用户名或密码都不正确,我没有“else if”语句来告诉程序该做什么,原因如下。它看起来像这样:
else if (user != un && pass != pw)
{
MessageBox.Show("User does not exist");
reader.Close();
}
假设我使用用户名和密码在数据库的第 6 行进行登录。该代码将首先检查第一行,并确定用户名和密码与数据库中的用户名和密码都不匹配。因此,该消息将显示“用户不存在”。然后继续检查下一行,由于用户名和密码也不匹配,因此会出现相同的消息。这将持续到找到匹配项为止。
所以我想知道,我应该如何更改代码,以便首先检查用户名是否存在。如果是,它应该检查该行中的密码是否与用户输入的密码匹配。如果两者匹配,请登录。
我希望这也能修复 MySqlDataReader 异常错误,该错误表示:“阅读器关闭时尝试读取无效”。我想我知道它为什么这样做:因为它跳出了我要求它关闭的“if”语句,并跳入了它读取我的读者的“while”语句。
最佳答案
为什么选择所有表?您应该仅使用 where 子句查询该登录名。当你看到你的阅读器为空时,你可以检查是否有这样的用户。如果为空则说明数据库中没有该用户。如果 reader 不为空,您知道数据库中有这样的用户,您可以简单地将您从 Reader 获得的密码与您的密码进行比较。
public static void Login(string user, string pass) {
var con = GetConnection();
try {
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = con;
cmd.CommandText = "SELECT username, password WHERE username = @username";
MySqlDataReader reader = cmd.ExecuteReader();
if (reader.HasRows) {
while (reader.Read()) {
string pw = reader.GetString(1);
if (pass == pw) {
MessageBox.Show("Welcome");
} else {
MessageBox.Show("Password Incorrect");
}
}
} else {
MessageBox.Show("There is no such user in database");
}
} catch (Exception e) {
con.Close();
MessageBox.Show(Convert.ToString(e));
} finally {
con.Close();
reader.Close();
}
}
关于c# - 登录页面和MySqlDataReader异常错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43893829/