2012-03-28 86 views
1

我一直随机收到此错误:连接当前状态的连接错误消息

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

它complaning有关的代码如下:

 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来关闭它,并且使用声明,它也应该关闭它?这种情况也会随机发生,不会总是这样,这就是为什么我不确定发生了什么。

谢谢。

回答

3

你并不需要关闭在最后,如果你正在使用的using-statement,因为它将从dispose隐含close它连接。

经验法则:对每个实现IDisposable(如Connections,DataAdapter,Commands)的类使用using语句。另一方面,DataSetDataTable手动或通过使用不执行它和does not need to be disposed

但变化:

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你隐藏了异常的原始来源。

https://stackoverflow.com/a/22628/284240

+1

沿着这些线路:命令对象也应该是在一个using语句。 – NotMe 2012-03-28 14:29:02

+0

@ChrisLively:据此编辑我的答案。 – 2012-03-28 14:40:51

+0

@TimSchmelter谢谢你。 – Paritosh 2012-03-29 13:31:21

0

带走finally块作为using声明将采取您关闭连接的护理