【问题标题】:Connection is closed mysqldatareader连接已关闭 mysqldatareader
【发布时间】:2017-09-19 08:27:30
【问题描述】:

我不知道为什么我的连接一直关闭而没有任何东西可以关闭连接。我曾尝试将它们封闭在using 块中,但无济于事。有没有更好的方法将单个选择查询传递给string

private void button2_Click(object sender, EventArgs e)
{


    string username = txtUsername.Text;
    string password = txtPassword.Text;
    string query = "SELECT isActive FROM tblUser WHERE username = ?username AND password = ?password";

    MySqlCommand cmd = new MySqlCommand(query, con.connection);

    cmd.Parameters.AddWithValue("?username", username);
    cmd.Parameters.AddWithValue("?password", password);
    con.connection.Open();
    MySqlDataReader mdr = cmd.ExecuteReader();

    string isActive="";
    string updatequery = "UPDATE tbluser SET DateLastLogin= '" + DateTime.Today.ToString("dd-mm-yy") + "',TimeLastLogin = '" + DateTime.Now.TimeOfDay + "', IsActive = 1 WHERE username = ?username";
    if (mdr.HasRows)
    {
        if(con.connection.State == ConnectionState.Closed)con.connection.Open();
        while (mdr.Read())
        {
            isActive = mdr[0].ToString();
            if (isActive.Equals("1"))
            {
                MessageBox.Show("This user is already logged in!");
            }
            else
            {
                MySqlCommand updatecmd = new MySqlCommand(updatequery, con.connection);

                con.OpenConnection();
                updatecmd.Parameters.AddWithValue("?username", username);
                updatecmd.ExecuteNonQuery();
                pnlLogin.Hide();
                pnlMenu.Show();
                MessageBox.Show("Welcome " + username);

            }

        }

    }
    else
    {
        MessageBox.Show("Invalid user credentials.");
    }



}

【问题讨论】:

  • 我不知道MySqlConnection,但肯定有SqlConnection,当DataReader 处于打开状态时,您不能将连接用于其他用途。您是否尝试过使用第二个 Connection 对象进行更新?
  • 我没有注意到我只为两个命令使用了 1 个连接。感谢您指出了这一点。我现在已经修复了我的代码。

标签: c# mysql winforms


【解决方案1】:

由于您没有关闭连接(这是错误的),因此您无需验证您的 con 是否已关闭即可打开它,因此您需要将其删除:

if(con.connection.State == ConnectionState.Closed)con.connection.Open();`

此外,您不需要再次打开您的连接,我相信您正在关闭您的连接,因为您在使用!isActive.Equals("0") 时使用con.OpenConnection(); 重新打开它。尝试删除con.OpenConnection(); 并检查。

如果您提供的此代码之后的行中没有任何新查询,最好.Close()您的连接。

【讨论】:

  • 我只是补充说,因为它一直说它已关闭。并且还删除了 con.CloseConnectiont() 以查看它是否仍会产生错误。我的问题实际上是我使用 1 个连接来执行两个查询,正如 Jonathan Willock 指出的那样
【解决方案2】:

我为更新查询创建了第二个连接语句,并删除了其他打开连接的语句。

 private void button2_Click(object sender, EventArgs e)
    {


                string username = txtUsername.Text;
                string password = txtPassword.Text;
                string query = "SELECT isActive FROM tblUser WHERE username = ?username AND password = ?password";

                MySqlCommand cmd = new MySqlCommand(query, con.connection);

                    cmd.Parameters.AddWithValue("?username", username);
                    cmd.Parameters.AddWithValue("?password", password);
                    con.connection.Open();
                    MySqlDataReader mdr = cmd.ExecuteReader();

                    string isActive="";
                    string updatequery = "UPDATE tbluser SET DateLastLogin= '" + DateTime.Today.ToString("dd-mm-yy") + "',TimeLastLogin = '" + DateTime.Now.TimeOfDay + "', IsActive = 1 WHERE username = ?username";
                    if (mdr.HasRows)
                    {

                        while (mdr.Read())
                        {
                            isActive = mdr[0].ToString();
                            if (isActive.Equals("1"))
                            {
                                MessageBox.Show("This user is already logged in!");
                            }
                            else
                            {
                                MySqlCommand updatecmd = new MySqlCommand(updatequery, con.connection2);

                                con.connection2.Open();
                                    updatecmd.Parameters.AddWithValue("?username", username);
                                    updatecmd.ExecuteNonQuery();
                                    pnlLogin.Hide();
                                    pnlMenu.Show();
                                    MessageBox.Show("Welcome " + username);

                            }

                        }

                    }
                    else
                    {
                        MessageBox.Show("Invalid user credentials.");
                    }

                    con.CloseConnection();

    }

【讨论】: