Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 连接未关闭连接';它的当前状态是开放的_C# - Fatal编程技术网

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);
}