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;代わりに使用する方がさらに良いでしょう。https://stackoverflow.com/a/4761295/284240throw ex;

于 2012-11-12T11:56:58.207 に答える
13

con.close()try catch ブロックを使用したすべての場所で、finally ブロックを記述し、その中に記述したほうがよいでしょう。例えば。

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

Check the connection state before opening it:

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