【问题标题】:MySQL connection seems to be only reading first queryMySQL 连接似乎只读取第一个查询
【发布时间】:2021-10-13 06:47:19
【问题描述】:

我正在做一个 C# 项目,直到现在我还没有遇到任何困难,问题是在编写一个简单的登录表单时。

这是它的代码:

    MySqlConnection con = new MySqlConnection();
    MySqlCommand com = new MySqlCommand();

    public LoginForm()
    {
        InitializeComponent();

        con.ConnectionString = @"Data Source=localhost;port=3306;Initial Catalog=databaseName;User id=root;password=''";
    }

    private void button1_Click(object sender, EventArgs e)
    {
        con.Open();

        com.Connection = con;
        com.CommandText = "select * from users";
        MySqlDataReader dr = com.ExecuteReader();
        if (dr.Read())
        {
            if (txtBoxUsername.Text.Equals(dr["username"].ToString()) && txtBoxPassword.Text.Equals(dr["password"].ToString()))
            {
                lblIncorrect.Text = "";
                this.Hide();
                InjectForm f2 = new InjectForm();
                f2.Show();
            }
            else
            {
                lblIncorrect.Text = "Incorrect userename or password.";
                txtBoxPassword.Text = "";
            }
        }
        con.Close();
    }

如您所见,单击按钮将打开我的 MySql 连接并从表用户中选择所有内容。然后检查文本框中输入的用户名和密码是否与存储在 phpMyAdmin 中的用户名和密码匹配。

现在问题来了,如果我使用第一个用户,它会正确登录并执行它应该做的事情,但另一方面,如果我使用第二个用户登录,它会抛出“错误的用户名或密码。”文本。

这一切都应该有效,但它只是没有。

有什么想法吗?

【问题讨论】:

  • 您应该在查询中使用 where 子句仅选择与用户名和密码匹配的行,而不是从表中选择所有行。
  • @OlivierRogier 我正在使用 wampserver
  • @Chetan 我试过了,也没用。
  • 哦,@OlivierRogier 我正在使用 MySql.Data.dll
  • 如果您先尝试使用第二个用户登录会怎样?我想它也不起作用?如果是这样,请检查您的用户权限,允许他们从哪些主机连接到哪个数据库等等。

标签: c# mysql sql select mysqldatareader


【解决方案1】:

为了优化内存消耗和加速,只需获取所需的记录。当数据变得非常大时,您会注意到执行速度的差异。

button1_Click 更改为:

private void button1_Click(object sender, EventArgs e)
{
     con.Open();

     com.Connection = con;
     com.CommandText = "select * from users where username = @username and password = @password";
     com.Parameters.Add("@username", SqlDbType.VarChar, 50).Value = txtBoxUsername.Text;
     com.Parameters.Add("@password", SqlDbType.VarChar, 50).Value = txtBoxPassword.Text;
     MySqlDataReader dr = com.ExecuteReader();
     if (dr.HasRows)
     {
         while (dr.Read())
         {
             lblIncorrect.Text = "";
             this.Hide();
             InjectForm f2 = new InjectForm();
             f2.Show();
             break;
         }
     }
     else
     {
         lblIncorrect.Text = "Incorrect userename or password.";
         txtBoxPassword.Text = "";
     }
     con.Close();
}

注意:使用while(dr.Read())读取所有行以滚动浏览所有行。

【讨论】:

  • @MeysamaAsadi 如果你写了一个答案,你应该把concomdr(也许f2ShowDialog)放在using块中。还要检查您想使用哪个变量名:comcommand。为什么要打破while循环?如果数据库设计可以给您多行,则不指定行为。如果您只想要第一行,请将CommandBehavior.SingleRow 添加到ExecuteReader,您不需要while 循环和if (dr.HasRows)。只是我的 2 美分 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
  • 2022-08-06
  • 2020-06-26
  • 1970-01-01
  • 2011-03-29
相关资源
最近更新 更多