Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

The connection was not closed the connection's current state is open

Tags:

c#

How to fix this problem; connection already closed in my function:

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);              
}
like image 463
Naeem Shah Avatar asked Nov 12 '12 11:11

Naeem Shah


4 Answers

I assume that the error is raised on this line:

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

since you're reusing a connection and you probably have not closed it last time.

You should always close a connection immediately as soon as you're finished with it, best by using the 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
}

Note that you should not use a Catch block just to rethrow an exception. If you don't do anything with it don't catch it at all. It would be even better to use throw; instead of throw ex; to keep the stack trace. https://stackoverflow.com/a/4761295/284240

like image 112
Tim Schmelter Avatar answered Nov 10 '22 09:11

Tim Schmelter


Better you write finally block and within it con.close() every where where you used try catch blocks. Eg.

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();
}
like image 25
Freelancer Avatar answered Nov 10 '22 08:11

Freelancer


Check the connection state before opening it:

if (con.State != ConnectionState.Open)
    con.Open(); 
like image 33
Shadow Wizard Hates Omicron Avatar answered Nov 10 '22 08:11

Shadow Wizard Hates Omicron


A little more than the answers already here, I check if it's not just open, but connecting, and wait if it's in the connecting state.

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

Of course you also need to put your con.Close() in a finally after try if you want to ensure your connection does get closed, since any code after the exception not in the finally doesn't get run.

Also you don't need to throw ex in your throw, you can just throw; by throwing ex you damage the stack trace.


Update: Looking over this I see you have con.Close() in your try AND in your finally - this will always error since if the try block works properly it will close the connection then move to the finally block which runs error or not, and try to close an already closed connection. Also be careful with your case - Close() and close() are not the same thing, only one actually calls the function, the other will error as it is undefined.

You need to remove the close from the try block and leave it only in the finally.

like image 22
Andrew Avatar answered Nov 10 '22 09:11

Andrew