2013-02-07 11 views
17

Który z poniższych dwóch przykładów jest prawidłowy? (A co jest lepsze i powinno się używać)Czy powinienem używać SqlDataReader wewnątrz instrukcji "using"?

W MSDN Znalazłem to:

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

Jednak patrząc inne strony niektórzy użytkownicy proponuję zrobić to w ten sposób:

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

Tak pytanie brzmi: czy mogę użyć instrukcji using również w SqlCommand aw SqlDataReader lub są one automatycznie usuwane na końcu kodu bloku SqlConnectionusing.

+2

Możliwy duplikat [Czy konieczne jest ręczne zamknięcie i pozbycie się SqlDataReader?] (Http://stackoverflow.com/questions/744051/is-it-necessary-to-manually-close-and-dispose-of- SqlDataReader) –

+0

również związane: [? Czy oddanie „używając” oświadczenie wokół DataReader zamknąć] (http://stackoverflow.com/q/2157276/456814). –

Odpowiedz

29

Druga opcja oznacza, że ​​reader zostanie zamknięty w przypadku wystąpienia wyjątku po to został stworzony, więc to jest korzystne.

To jest skutecznie przekształcone przez kompilator do:

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

Zobacz MSDN aby uzyskać więcej informacji.

8

Można rzeczywiście listy usings razem, 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

Czy nie byłoby prościej użyć tego kodu?

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

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

Powinno to spowodować pozbycie się czytnika oraz niejawne połączenie i polecenie po zakończeniu użytkowania.

Albo mieć coś mi umknęło?

Powiązane problemy