Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.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#_Ado.net_Datatable - Fatal编程技术网

C# 连接当前状态为连接错误消息

C# 连接当前状态为连接错误消息,c#,ado.net,datatable,C#,Ado.net,Datatable,我一直随机得到这个错误: System.Web.Services.Protocols.SoapException:System.Web.Services.Protocols.SoapException:服务器无法处理请求。-->System.InvalidOperationException:连接未关闭。连接的当前状态为“正在连接” 它抱怨的代码如下: DataSet ds = new DataSet(); cn = new SqlConnection(GetD

我一直随机得到这个错误:

System.Web.Services.Protocols.SoapException:System.Web.Services.Protocols.SoapException:服务器无法处理请求。-->System.InvalidOperationException:连接未关闭。连接的当前状态为“正在连接”

它抱怨的代码如下:

        DataSet ds = new DataSet(); 
        cn = new SqlConnection(GetDBConnectionString()); 

        using (cn) 
        { 
            try 
            { 
                SqlCommand cmd = new SqlCommand("uspGetNavigationItems", cn); 
                cmd.CommandType = CommandType.StoredProcedure; 
                cn.Open(); 
                SqlDataAdapter adp = new SqlDataAdapter(cmd); 
                adp.Fill(ds, "NavItems"); 
            } 
            catch (Exception ex) 
            { 
                ds = null; 
                throw ex; 
            } 
            finally 
            { 
                if (cn.State != ConnectionState.Closed) 
                { 
                    cn.Close(); 
                } 
            } 
        } 

        if (ds.Tables.Count > 0) 
        { 
            if (ds.Tables[0].Rows.Count > 0) 
            { 
                return ds.Tables[0]; 
            } 
            else 
            { 
                return null; 
            } 
        } 
        else 
        { 
            return null; 
        }
我不明白问题在哪里,为什么它说连接正在连接,当我终于有了一个解决办法的时候。是因为我正在使用Finally to close和using语句,该语句也应该关闭它吗?同样,这是随机发生的,但并不总是如此,这就是为什么我不确定发生了什么


谢谢。

当您使用
语句时,去掉最后一个块将负责关闭连接

当您使用
语句时,去掉最后一个块将负责关闭连接

如果您使用
使用语句
因为它将
关闭
它将从
处理
隐式关闭

经验法则:对每个实现的类(如连接、数据适配器、命令)使用using语句。另一方面,
数据集
数据表
不会手动或通过使用来实现它

但变化:

cn = new SqlConnection(GetDBConnectionString()); 
using (cn) 
{
    //code
}
致:

这将转化为:

SqlConnection cn = new SqlConnection(GetDBConnectionString());
try
{
    //code
}
finally
{
    if (cn != null)
       ((IDisposable)cn).Dispose();
}
旁注
throw
而不是
throw ex
将保留堆栈跟踪。使用
throw ex
可以隐藏异常的原始源


如果使用
using语句,则不需要最后关闭连接,因为它将
dispose
隐式关闭它

经验法则:对每个实现的类(如连接、数据适配器、命令)使用using语句。另一方面,
数据集
数据表
不会手动或通过使用来实现它

但变化:

cn = new SqlConnection(GetDBConnectionString()); 
using (cn) 
{
    //code
}
致:

这将转化为:

SqlConnection cn = new SqlConnection(GetDBConnectionString());
try
{
    //code
}
finally
{
    if (cn != null)
       ((IDisposable)cn).Dispose();
}
旁注
throw
而不是
throw ex
将保留堆栈跟踪。使用
throw ex
可以隐藏异常的原始源


沿着这些线:命令对象也应该在using语句中。@chrislive:相应地编辑了我的答案。沿着这些线:命令对象也应该在using语句中。@chrislive:相应地编辑了我的答案。