2012-03-28 141 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聲明將採取您關閉連接的護理

相關問題