2012-03-28 5 views
1

ich diesen Fehler erhalten immer zufällig:Verbindungs ​​aktuelle Zustand verbindet Fehlermeldung

System.Web.Services.Protocols.SoapException: System.Web.Services.Protocols.SoapException: Server konnte die Anforderung verarbeiten. ---> System.InvalidOperationException: Die Verbindung wurde nicht geschlossen. Der aktuelle Status der Verbindung ist verbunden.

Der Code über es complaning unter:

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

Ich verstehe nicht, wo das Problem ist, warum es die Verbindung sagt verbindet, als ich endlich haben es aufzuräumen. Liegt es daran, dass ich schliesslich schließe und die using-Anweisung, die es auch schließen soll? Auch das passiert zufällig nicht immer, deshalb bin ich mir nicht sicher was los ist.

Vielen Dank.

Antwort

3

Sie brauchen nicht die Verbindung in endlich zu schließen, wenn Sie die using-statement verwenden, da sie es von disposeclose wird implizit .

Faustregel: Verwenden Sie die using-Anweisung für jede Klasse, die IDisposable implementiert (wie Connections, DataAdapter, Commands). Auf der anderen Seite, ein DataSet oder DataTable implementiert es nicht und does not need to be disposed manuell oder über die Verwendung.

Aber Veränderung:

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

zu:

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

Dies übersetzt werden wird:

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

Nebenbei bemerkt: throw statt throw ex die stacktrace halten würde. Mit throw ex verstecken Sie die ursprüngliche Quelle der Ausnahme.

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

+1

Entlang dieser Linien: der Befehl Objekt sollte auch in einer using-Anweisung sein. – NotMe

+0

@ChrisLively: Bearbeitete meine Antwort entsprechend. –

+0

@TimSchmelter danke. – Paritosh

0

wegnehmen, die schließlich blockieren als using Anweisung Pflege Ihrer Verbindung dauern wird Closing

Verwandte Themen