c# - 登录页面和MySqlDataReader异常错误

标签 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”语句来告诉程序该做什么,原因如下。它看起来像这样:

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/

相关文章:

PostgreSQL:如何捕获函数中的异常?

c# - 使用 BluetoothLEDevice.FromIdAsync 连接到蓝牙设备会导致错误

mysql命令行连接到azure

java - 仅当没有抛出异常时如何执行代码块

mysql - JOIN 与 "just"选择

php - 在封装 PDO 事务中使用闭包不起作用。为什么?

c++ - C++中异常的调用栈

c# - 将实现转换为具有泛型类型的接口(interface)

C# 正则表达式. 替换为现有单词

c# - HttpClient 的奇怪异步问题