如何解决这个问题;连接已在我的函数中关闭:
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);
}
答案 0 :(得分:21)
我认为此行引发了错误:
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;
而不是throw ex;
来保持堆栈跟踪会更好。 https://stackoverflow.com/a/4761295/284240
答案 1 :(得分:7)
最好你在每个使用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();
}
答案 2 :(得分:4)
打开前检查连接状态:
if (con.State != ConnectionState.Open)
con.Open();
答案 3 :(得分:2)
比这里已有的答案多一点,我检查它是不是只是打开,而是连接,等待它处于连接状态。
if (con.State != ConnectionState.Open && co.State != ConnectionState.Connecting) {
con.Open();
}
var attempts = 0;
while (con.State == ConnectionState.Connecting && attempts < 10) {
attempts++;
Thread.Sleep(500);
}
当然,如果你想确保你的连接关闭,你还需要在con.Close()
之后finally
放置try
,因为异常之后的任何代码都不在finally
中{1}}无法运行。
此外,您不需要throw ex
投掷,只需throw;
投掷,即可破坏堆栈跟踪。
答案 4 :(得分:1)
您的连接字符串已打开。 您可以使用代码进行检查:
if(cmd.Connection.State != ConnectionState.Open) cmd.Connection.Open();