连接未关闭,连接的当前状态已打开

如何解决这个问题; 连接已在我的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();