7

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

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);              
}
4

5 回答 5

28

我假设在这一行引发了错误:

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

于 2012-11-12T11:56:58.207 回答
13

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

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();
}
于 2012-11-12T12:01:04.560 回答
8

打开前检查连接状态:

if (con.State != ConnectionState.Open)
    con.Open(); 
于 2012-11-12T11:55:45.550 回答
4

比这里的答案多一点,我检查它是否不仅打开,而且正在连接,并等待它是否处于连接状态。

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

当然,如果您想确保您的连接确实关闭,您还需要con.Close()finallyafter中添加,因为异常之后的任何代码都不会运行。tryfinally

你也不需要throw ex在你的投掷中,你可以throw;通过投掷 ex 来破坏堆栈跟踪。


更新:查看此内容,我发现您con.Close()在 try 和 finally 中都有 - 这将始终出错,因为如果 try 块正常工作,它将关闭连接,然后移动到运行错误的 finally 块,并尝试关闭已经关闭的连接。还要小心你的情况 - Close() 和 close() 不是一回事,只有一个实际调用该函数,另一个会出错,因为它未定义。

您需要从 try 块中删除 close 并仅将其保留在 finally 中。

于 2017-01-27T16:19:55.827 回答
2

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

if(cmd.Connection.State != ConnectionState.Open) cmd.Connection.Open();
于 2016-09-17T08:26:41.673 回答