连接未关闭,连接的当前状态已打开
如何解决这个问题; 连接已在我的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); }
最好你写finally块,并在其中con.close()
你使用try catch块的每个地方。 例如。
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(); }
我假设在这一行上引发了错误:
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
块来重新抛出exception。 如果你不做任何事情就不要抓住它。 使用throw;
会更好throw;
而不是throw ex;
保持堆栈跟踪。 https://stackoverflow.com/a/4761295/284240
打开前检查连接状态:
if (con.State != ConnectionState.Open) con.Open();
比这里的答案多一点,我检查它是不是只是打开,而是连接,等待它处于连接状态。
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
,因为在finally
之后的任何代码都没有运行。
你也不需要throw ex
你的投掷,你可以throw;
通过抛出你会损坏堆栈跟踪。
您的连接字符串已打开。 您可以使用代码进行检查:
if(cmd.Connection.State != ConnectionState.Open) cmd.Connection.Open();