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);
}
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
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();
}
Check the connection state before opening it:
if (con.State != ConnectionState.Open)
con.Open();
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With