登录页面和MySqlDataReader异常错误

时间:2017-05-10 13:24:50

标签: c# mysql exception

我目前正在开发一个项目,该项目要求我创建一个登录页面,该页面查看用户输入,并将它们与数据库中的值进行比较。更具体地说,用户名和密码。 这就是我的代码的样子:

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 (user != un && pass != pw)
        {
            MessageBox.Show("User does not exist");
            reader.Close();
        }

让我说我在数据库的第6行用用户名和密码登录。代码将从检查第一行开始,并确定用户名和密码都不匹配数据库中的用户名和密码。因此,消息将显示"用户不存在"。然后继续检查下一行,由于用户名和密码也不匹配,所以会出现相同的消息。这一直持续到匹配为止。

所以我想知道,我应该如何更改代码,以便首先检查用户名是否存在。如果是,则应检查该行中的密码是否与用户输入的密码匹配。如果它们都匹配,请登录。

我希望反过来,这也解决了MySqlDataReader异常错误,该错误说明:"读取器关闭时无效的读取尝试"。我想我知道它为什么会这样做:它是因为它跳出了"如果"声明我要求它关闭,并进入"而#34;声明,它读取我的读者。

2 个答案:

答案 0 :(得分:0)

为什么选择所有桌子?您应该仅使用where子句查询该登录名。当您看到阅读器为空时,您可以检查是否有这样的用户。如果它是空的你知道数据库中没有这样的用户。如果读卡器不是空的你知道在数据库中有这样的用户你可以简单地比较你从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();
        }

    }

答案 1 :(得分:0)

如果我理解你的问题,你只需要在你的选择中添加一个where子句。像这样:

cmd.CommandText = "SELECT username, password FROM user_data where username = '" + user + "';";

通过此选择,您只能从表中获得一条记录(用户名必须是唯一的)。 然后你需要在HasRows中放入一个else条件,如果读者有行,则只需验证密码:

if (reader.HasRows) {
 ...
} else {
     MessageBox.Show("Username is incorrect");
}