MySQL连接无法关闭

时间:2018-07-24 11:41:58

标签: c#

我现在在我的项目中碰壁。 我有一个带有一些列表框的表单,并添加了按钮。当我单击添加按钮时,我得到一个带有文本框,确定和取消按钮的小对话框。该应用已连接到MySQL数据库。因此,每当文本更改时,程序都会检查数据库中是否存在该名称,请禁用“确定”按钮,如果该名称存在,则文本框将变为红色,否则它将恢复为正常状态。当我正在编写且名称不存在时,它可以正常工作,当它出现时,它会像应有的那样变成红色。这就是问题所在。变成红色后,即使输入了有效的名称,它也不会恢复正常。

这是代码:

private void DialogTxb_TextChanged(object sender, EventArgs e)
{
    //ConnexionData class where i do all the SQL manipulation
    MySqlDataReader selection = ConexionData.CheckSectionName(DialogTxb.Text);
    while (selection.Read())
    {
        if (selection.HasRows)
        {
            DialogOk.Enabled = false;
            toolTip1.Show("La section existe", TooltibLb);
            DialogTxb.BackColor = System.Drawing.ColorTranslator.FromHtml("#ffaaaa");
        }
        else
        {
            toolTip1.Hide(TooltibLb);
            DialogTxb.BackColor = Color.White;
            DialogOk.Enabled = true;
        }
    }
    ConexionData.ConexionClose();//Method to close connection
}

我想我知道问题出在哪里,但不知道为什么会发生以及如何解决。如果我只是退出表单并尝试执行其他操作,例如从列表框中选择另一个元素,这将触发一些数据库交互,则程序关闭并且Visual Studio为我提供了有关错误的信息:“连接已打开”。我试图关闭代码的其他时间,在互联网上寻找一些解决方案,尝试使用MysqlConection.ClearAllPools(),并且仍然是同一问题。

Connexion在应用程序的其他部分正确打开和关闭。

感谢您的关注。

修改

以下是ConexionData中的方法

class ConnexionData
{
    private static MySqlConnection Connexion;

    public static MySqlCommand Command;

    //Many other methods
    //.......

    public static void ConnexionClose()
    {
        Connexion.Close();
    }

    public static MySqlDataReader CheckSectionName(string name)
    {
        Connexion.Open();
        string checkSectionName = ("Select sectionName from section where sectionName = '" + name + "'");
        Command.CommandText = checkSectionName;
        Reader = Command.ExecuteReader();
        return Reader;
    }
}

我在程序的许多部分中使用了Connexion.Close()。我有2个数据网格视图,以及一些从数据库加载数据的列表框。我打开和关闭那些DGV并在列表框中更改值,所有这些工作正常。然后,我尝试用我的小型表单在这些表上插入新值,对其进行测试并关闭(实际上我什么也没插入,我只是将其关闭,并且close事件中有一个ConexionData.Close()),在这里出现了问题所在连接开始。

已解决

我终于解决了这个问题。我将Private MysqlConection设为公开,并在关闭对话框后直接关闭了该属性。

2 个答案:

答案 0 :(得分:3)

如果selection.Read()返回true,则表示您至少有1条记录。看来您在找

   private void DialogTxb_TextChanged(object sender, EventArgs e) { 
     try {
       //TODO: check ConexionData.CheckSectionName (re-)creates connection if required
       using (MySqlDataReader selection = ConexionData.CheckSectionName(DialogTxb.Text)) {
         if (selection.Read()) {
           // Name exists (we've read it)

           DialogOk.Enabled = false;
           toolTip1.Show("La section existe", TooltibLb);
           DialogTxb.BackColor = System.Drawing.ColorTranslator.FromHtml("#ffaaaa");
         }
         else {
           // Name doesn't exist: the cursor is empty (so we've failed to read it)

           toolTip1.Hide(TooltibLb);
           DialogTxb.BackColor = Color.White;
           DialogOk.Enabled = true;
         }
       }
     }
     finally { 
       // finally: rain or shine the connection should be closed
       ConexionData.ConexionClose(); // Method to close connection
     }
   }

答案 1 :(得分:0)

如果连接没有关闭,那么您可以在执行方法“ CheckSectionName()”之前尝试调用close()连接或sqldatareader。 FYR下面是一些示例,如果有帮助,请告诉我。

方法1:

    System.Data.SqlClient.SqlConnection sqlConn = new System.Data.SqlClient.SqlConnection();
     if(sqlConn.State!= System.Data.ConnectionState.Closed)
        {
           sqlConn.Close();
       }
 System.Data.SqlClient.SqlDataReader SqlReader= new System.Data.SqlClient.SqlDataReader();

                    if(!SqlReader.IsClosed)
                    {
                        SqlReader.Close();
                    }
    MySqlDataReader selection = ConexionData.CheckSectionName(DialogTxb.Text);

方法2:我们可以使用“ using”子句

using (MySqlDataReader selection = ConexionData.CheckSectionName(DialogTxb.Text))

方法3: 将close()和dispose()添加到finally块中。