web-dev-qa-db-ja.com

「using」ステートメント内でSqlDataReaderを使用する必要がありますか?

次の2つの例のうち正しいものはどれですか? (またはどちらが良いか、私は使用する必要があります)

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

したがって、質問は、usingおよびSqlCommandでもSqlDataReaderステートメントを使用する必要がありますか、それともSqlConnectionusingコードブロックの最後に自動的に破棄されます。

24
Keoki

2番目のオプションは、readerが作成された後に例外が発生した場合に閉じられることを意味するため、推奨されます。

コンパイラによって次のように効果的に変換されます。

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

詳細については [〜#〜] msdn [〜#〜] をご覧ください。

33
Daniel Kelley

あなたは実際に一緒に使用してリストすることができます、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]));
            }
        }
    }
}
15
BinaryTox1n

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

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

これにより、リーダーが破棄され、使用が終了すると暗黙的な接続とコマンドが破棄されます。

または私は何かを見逃しましたか?

1
SimonA