C# 连接未关闭连接';它的当前状态是开放的
如何解决这个问题;我的函数中的连接已关闭:C# 连接未关闭连接';它的当前状态是开放的,c#,C#,如何解决这个问题;我的函数中的连接已关闭: SqlConnection con=new SqlConnection(@"Here is My Connection"); public void run_runcommand(string query) { try { con.Open(); SqlCommand cmd1 = new SqlCommand(query, con); cmd1.
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);
}
打开连接之前,请检查连接状态:
if (con.State != ConnectionState.Open)
con.Open();
我假设这一行出现了错误:
con.Open(); // InvalidOperationException if it's already open
因为您正在重用一个连接,而您上次可能还没有关闭它
您应该在完成连接后立即关闭连接,最好使用using语句
:
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代码>以保留堆栈跟踪 最好编写finally块,并在其中con.close()
每个使用try-catch块的地方。
例如
您的连接字符串已打开。
您可以使用代码进行检查:
if(cmd.Connection.State != ConnectionState.Open) cmd.Connection.Open();
比这里已经给出的答案多一点,我检查它是否不仅是打开的,而且是连接的,然后等待它是否处于连接状态
if (con.State != ConnectionState.Open && con.State != ConnectionState.Connecting) {
con.Open();
}
var attempts = 0;
while (con.State == ConnectionState.Connecting && attempts < 10) {
attempts++;
Thread.Sleep(500);
}
if(con.State!=ConnectionState.Open&&con.State!=ConnectionState.Connecting){
con.Open();
}
var=0;
while(con.State==ConnectionState.Connecting&&truments<10){
尝试++;
睡眠(500);
}
当然,如果要确保连接确实关闭,您还需要将con.Close()
放在finally
之后的try
中,因为finally
中没有的异常之后的任何代码都不会运行
你也不需要在掷骰子时抛出ex,你只需要抛出代码>通过抛出ex,您会损坏堆栈跟踪
更新:查看此信息,我发现您的try和finally中都有con.Close()
,这将始终是错误的,因为如果try块正常工作,它将关闭连接,然后移动到运行错误或不运行错误的finally块,并尝试关闭已关闭的连接。还要注意大小写-Close()和Close()不是一回事,只有一个实际调用函数,另一个会出错,因为它未定义
您需要从try块中删除close,只将其保留在finally中。顺便说一句,catch(Exception ex){throw ex;}
没有任何好处,但有很多坏处。您应该使用throw而不是throw ex,因为它保留堆栈tracecon.close()需要时,我会尝试以上两种代码,但当我的查询第二次执行时,仍然会出现错误,然后错误会出现其他明智的第一次错误不会出现shown@NaeemShah:那么您在方法中没有使用using
来创建连接。因此,当您第二次调用该方法时,首先创建连接,然后打开连接。但是,using语句
就像一个finally块。所以这没有什么区别。@TimSchmelter:我从来没有在我的项目中使用过using语句。那么,使用语句是否会自动关闭连接?@自由职业者:是的,这就是我在回答中想说的(“你应该在完成连接后立即关闭连接,最好使用使用语句:”)。所以using
就是在最后调用dispose
(即使在异常情况下)<代码>连接
肯定会自动关闭处理
。实际上,在每个实现的对象上使用use
是一种很好的做法,因为它可能包含非托管资源(例如,您的SqlCommand
)。@TimSchmelter:Ohh。谢谢你提供我新的信息。那奈姆·沙阿的案子发生了什么?它不起作用了?@自由职业者:我不知道,我想他还没有把所有的东西都写进使用声明中,而是留在了他的连接域中。始终在使用连接的位置(在方法中)创建/处置连接。
if (con.State != ConnectionState.Open && con.State != ConnectionState.Connecting) {
con.Open();
}
var attempts = 0;
while (con.State == ConnectionState.Connecting && attempts < 10) {
attempts++;
Thread.Sleep(500);
}