System.InvalidOperationException:未关闭连接

时间:2017-05-29 19:56:12

标签: c# sql visual-studio

我的代码:

    private void button2_Click(object sender, EventArgs e)
    {
        sql.Open();

        string id = textBox1.Text;
        string cadena = "DELETE FROM contacts WHERE id=" + id;
        SqlCommand command = new SqlCommand(cadena, sql);

        int cant;
        cant = command.ExecuteNonQuery();

        if (cant == 1)
        {
            label4.Text = "";
            label5.Text = "";
            MessageBox.Show("Se ha eliminado");
        }
        else
            MessageBox.Show("No existe un artículo con el código ingresado");

        sql.Close();
        button2.Enabled = false;
    }

但已经宣布密切联系。

5 个答案:

答案 0 :(得分:0)

检查你的     sql.Close(); 它看起来它包含在else块中。

    int cant;
   cant = command.ExecuteNonQuery();
    sql.Close(); //Move it here.
    if (cant == 1)
    {
        label4.Text = "";
        label5.Text = "";
        MessageBox.Show("Se ha eliminado");
    }
    else
    {
        MessageBox.Show("No existe un artículo con el código ingresado");
    }
    button2.Enabled = false;

使用后应关闭连接。

答案 1 :(得分:0)

让我们从一开始就做到这一点,犯下了太多的罪行:

 //DONE: extract business logics, do not mix it with UI
 private bool DropContact(string id) {
   //DONE: do not share single connection, but create when you want it
   //DONE: wrap IDisposable into using
   using (SqlConnection con = new SqlConnection(ConnectionStringHere)) {
     con.Open();

     //DONE: make sql readable
     //DONE: make sql parametrized
     string cadena = 
       @"DELETE 
           FROM contacts 
          WHERE id = @prm_id";

     //DONE: wrap IDisposable into using
     using (SqlCommand command = new SqlCommand(cadena, con)) {
       //TODO: explict parameter type (int/string?) is a better then inplicit AddWithValue
       command.Parameters.AddWithValue("@prm_id", id);

       return command.ExecuteNonQuery() >= 1;
     }
   } 
 }
 ...
 private void button2_Click(object sender, EventArgs e) {
   if (DropContact(textBox1.Text)) {
     label4.Text = "";
     label5.Text = "";
     MessageBox.Show("Se ha eliminado");
   }
   else {
     MessageBox.Show("No existe un artículo con el código ingresado");
   }

   button2.Enabled = false;
 } 

答案 2 :(得分:0)

您似乎正在分享sql对象。我认为问题是你在其他地方打开了一个连接但从未关闭它。最终的结果是你进入这个功能,当你调用这一行时它会中断:

sql.Open();

检查您的代码并找到未正确关闭连接的位置。

此外,最好不要像这样共享连接对象,而是每次都创建一个新对象。

答案 3 :(得分:0)

您的代码有两个问题: 1)您可以在连接关闭之前获得异常。 为了避免使用using语句,它非常舒适,因为它具有捕获异常支持,或者您可以在finally块中使用try-catch-finally语句和关闭连接。 2)仅对每个连接初始化SqlConnection对象(请检查示例)。不要在单独的操作之间共享它,因为它可能会导致您的意思问题。

using (SqlConnection con = new SqlConnection(connectionString))
{
   con.Open();
   using (SqlCommand command = new SqlCommand("your query", con))
   {
    // output processing
   }
}

答案 4 :(得分:0)

您需要在重新打开之前检查连接状态(如果您像全局一样全局使用它)。顺便说一句(不要公开连接或长时间打开)

if (sql != null && sql.State == ConnectionState.Closed)
    sql.Open();

在尝试打开连接之前,只需添加此if条件。但最好是改善你的策略。