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

后端 未结 5 946
太阳男子
太阳男子 2020-11-30 10:56

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

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

public void run_runcomma         


        
相关标签:
5条回答
  • 2020-11-30 11:08

    Your connection string is opened. You can use code to check it:

    if(cmd.Connection.State != ConnectionState.Open) cmd.Connection.Open();
    
    0 讨论(0)
  • 2020-11-30 11:14

    Check the connection state before opening it:

    if (con.State != ConnectionState.Open)
        con.Open(); 
    
    0 讨论(0)
  • 2020-11-30 11:15

    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();
    }
    
    0 讨论(0)
  • 2020-11-30 11:22

    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

    0 讨论(0)
  • 2020-11-30 11:25

    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.

    0 讨论(0)
提交回复
热议问题