私の関数では接続が既に終了しているのですが、どうすれば直せますか?
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);
}
この行でエラーが発生するのだと思われます。
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 ex;
の代わりに throw;
を使うとさらに良いでしょう。 https://stackoverflow.com/a/4761295/284240
そのため、try catchブロックを使っているところでは、finallyブロックとその中に con.close()
を記述するのがよいでしょう。
例えば
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();
}