2013-02-07 19 views
17

次の2つの例はどれが正しいですか?私はこれを見つけた"using"ステートメントの内部でSqlDataReaderを使用する必要がありますか?

MSDNで(あるいは、どちらが優れていると私は使用する必要があります):

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

ただし、一部のユーザーはそれをこのように行うことをお勧め他のページ探して:だから

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

を問題は:SqlCommandSqlDataReaderにもusingステートメントを使用するか、SqlConnectionusingコードブロックの末尾に自動的に配置するかどうかです。

+2

[SqlDataReaderを手動で閉じて処分する必要がありますか?](http://stackoverflow.com/questions/744051/is-it-necessary-to-manually-close-and-dispose-of- –

+0

関連項目:[DataReaderを閉じるために "using"ステートメントを置くことはできますか?](http://stackoverflow.com/q/2157276/456814)。 –

答えて

29

第2のオプションは、作成後に例外が発生した場合にreaderがクローズされることを意味します。

それを効果的にコンパイラによって変換されます。詳細は

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

を参照してくださいMSDN

8

あなたは実際に、一緒にラをusingsを一覧表示することができます。

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

このコードを使用する方が簡単ではないでしょうか?

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

これは、読者と、使用が終了したときの暗黙的な接続とコマンドを処理する必要があります。

または私は何かを逃したのですか?

関連する問題