连接当前状态是连接错误消息

时间:2012-03-28 14:09:50

标签: c# ado.net datatable

我一直随机收到此错误:

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关闭和using语句,它应该关闭它吗?再次发生这种情况并不总是发生,这就是为什么我不确定发生了什么。

谢谢。

2 个答案:

答案 0 :(得分:3)

如果您使用的是using-statement,则无需最后关闭连接,因为它会close隐含dispose

经验法则:对每个实现IDisposable的类使用using语句(如Connections,DataAdapter,Commands)。另一方面,DataSetDataTable并未手动或通过使用来实现cn = new SqlConnection(GetDBConnectionString()); using (cn) { //code }

但改变:

using (var cn = new SqlConnection(GetDBConnectionString())) 
{
    //code
}

为:

SqlConnection cn = new SqlConnection(GetDBConnectionString());
try
{
    //code
}
finally
{
    if (cn != null)
       ((IDisposable)cn).Dispose();
}

这将被翻译为:

throw

旁注throw ex代替throw ex会保留堆栈跟踪。使用{{1}},您将隐藏异常的原始来源。

does not need to be disposed

答案 1 :(得分:0)

当你的using声明处理你的连接关闭

时,取消最后阻止