连接未关闭,连接的当前状态已打开

时间:2012-11-12 11:53:11

标签: c#

如何解决这个问题;连接已在我的函数中关闭:

SqlConnection con=new SqlConnection(@"Here is My Connection");

public void run_runcommand(string query)   
{   

    try   
    {   
        con.Open();   
        SqlCommand cmd1 = new SqlCommand(query, con);   

        cmd1.ExecuteNonQuery();    
        con.Close();    
    }    
    catch (Exception ex) { throw ex; }                        
}    
//...
try       
{           
    string query="my query";           
    db.run_runcommand(query);          
}         
catch(Exception ex)            
{         
    MessageBox.Show(ex.Message);              
}

5 个答案:

答案 0 :(得分:21)

我认为此行引发了错误:

con.Open(); // InvalidOperationException if it's already open

因为您正在重复使用连接,而您上次可能还没有关闭它。

您应该在完成连接后立即关闭连接,最好使用using-statement

public void run_runcommand(string query)   
{
    using(var con = new SqlConnection(connectionString))
    using(var cmd = new SqlCommand(query, con))
    {
        con.Open();
        // ...
    }  // close not needed since dispose also closes the connection
}

请注意,您不应仅使用Catch块来重新抛出异常。如果你不做任何事情就不要抓住它。使用throw;而不是throw ex;来保持堆栈跟踪会更好。 https://stackoverflow.com/a/4761295/284240

答案 1 :(得分:7)

最好你在每个使用try catch块的地方写下finally块并在其中con.close()。 例如

public void run_runcommand(string query)   
{   
    try   
    {   
        con.Open();   
        SqlCommand cmd1 = new SqlCommand(query, con);   

        cmd1.ExecuteNonQuery();    
        con.Close();    
    }    
    catch (Exception ex)
    {
       throw ex; //TODO: Please log it or remove the catch
    }
    finally
    {
       con.close();
    }

}


try       
{           
    string query="my query";           
    db.run_runcommand(query);          
}         
catch(Exception ex)            
{         
    MessageBox.Show(ex.Message);              
}   
finally
{
   con.close();
}

答案 2 :(得分:4)

打开前检查连接状态:

if (con.State != ConnectionState.Open)
    con.Open(); 

答案 3 :(得分:2)

比这里已有的答案多一点,我检查它是不是只是打开,而是连接,等待它处于连接状态。

if (con.State != ConnectionState.Open && co.State != ConnectionState.Connecting) {
    con.Open();
}
var attempts = 0;
while (con.State == ConnectionState.Connecting && attempts < 10) {
    attempts++;
    Thread.Sleep(500);
}

当然,如果你想确保你的连接关闭,你还需要在con.Close()之后finally放置try,因为异常之后的任何代码都不在finally中{1}}无法运行。

此外,您不需要throw ex投掷,只需throw;投掷,即可破坏堆栈跟踪。

答案 4 :(得分:1)

您的连接字符串已打开。 您可以使用代码进行检查:

if(cmd.Connection.State != ConnectionState.Open) cmd.Connection.Open();