2013-02-07 5 views
17

Welches der folgenden zwei Beispiele ist richtig? (Oder was ist besser und sollte ich)Sollte ich SqlDataReader innerhalb einer "using" -Anweisung verwenden?

In der MSDN ich dies gefunden:

private static void ReadOrderData(string connectionString) 
{ 
    string queryString = "SELECT OrderID, CustomerID FROM dbo.Orders;" 

    using (SqlConnection connection = new SqlConnection(connectionString)) 
    { 
     SqlCommand command = new SqlCommand(queryString, connection); 
     connection.Open(); 

     SqlDataReader reader = command.ExecuteReader(); 

     // Call Read before accessing data. 
     while (reader.Read()) 
     { 
      Console.WriteLine(String.Format("{0}, {1}", reader[0], reader[1])); 
     } 

     // Call Close when done reading. 
     reader.Close(); 
    } 
} 

Allerdings suchen anderen Seiten einige Benutzer vorschlagen, es auf diese Weise zu tun:

private static void ReadOrderData(string connectionString) 
{ 
    string queryString = "SELECT OrderID, CustomerID FROM dbo.Orders;"; 

    using (SqlConnection connection = new SqlConnection(connectionString)) 
    { 
     using (SqlCommand command = new SqlCommand(queryString, connection)) 
     { 
      connection.Open(); 

      using (SqlDataReader reader = command.ExecuteReader()) 
      { 
       // Call Read before accessing data. 
       while (reader.Read()) 
       { 
        Console.WriteLine(String.Format("{0}, {1}", reader[0], reader[1])); 
       } 
      } 
     } 
    } 
} 

So Die Frage ist: Soll ich die using Anweisung auch in der SqlCommand und in der SqlDataReader verwenden oder werden sie automatisch am Ende des SqlConnectionusing Codeblocks angeordnet.

+2

Mögliches Duplikat von [Muss SqlDataReader manuell geschlossen und entsorgt werden?] (Http://stackoverflow.com/questions/744051/is-it-necessary-to-manually-close-and-dispose-of- sqldatareader) –

+0

Auch verwandt: [Wird das Setzen einer "using" -Anweisung um einen DataReader es schließen?] (http://stackoverflow.com/q/2157276/456814). –

Antwort

29

Die zweite Option bedeutet, dass Ihre reader im Falle einer Ausnahme geschlossen wird, nachdem es erstellt wurde, so ist es bevorzugt.

SqlDataReader reader = command.ExecuteReader(); 
try 
{ 
    .... 
} 
finally 
{ 
    if (reader != null) 
     ((IDisposable)reader).Dispose(); 
} 

MSDN für weitere Informationen siehe:

Es wird wirksam durch den Compiler transformiert.

8

Sie können usings tatsächlich Liste zusammen, a la:

private static void ReadOrderData(string connectionString) 
{ 
    string queryString = 
     "SELECT OrderID, CustomerID FROM dbo.Orders;"; 

    using (SqlConnection connection = new SqlConnection(connectionString)) 
    using (SqlCommand command = new SqlCommand(queryString, connection)) 
    { 
     connection.Open(); 

     using (SqlDataReader reader = command.ExecuteReader()) 
     { 
      // Call Read before accessing data. 
      while (reader.Read()) 
      { 
       Console.WriteLine(String.Format("{0}, {1}", 
       reader[0], reader[1])); 
      } 
     } 
    } 
} 
1

Wäre es nicht einfacher, diesen Code zu verwenden?

Dies sollte den Leser und die implizite Verbindung und den Befehl beseitigen, wenn die Verwendung beendet wird.

Oder habe ich etwas verpasst?

Verwandte Themen