web-dev-qa-db-fra.com

Dois-je utiliser SqlDataReader dans une instruction "using"?

Lequel des deux exemples suivants est correct? (Ou lequel est le meilleur et dois-je utiliser)

Dans le MSDN, j'ai trouvé ceci:

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

Cependant, en regardant d'autres pages, certains utilisateurs suggèrent de le faire de cette façon:

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

Donc, la question est: dois-je utiliser l'instruction using également dans SqlCommand et dans SqlDataReader ou ils sont automatiquement supprimés à la fin de SqlConnectionusing bloc de code.

24
Keoki

La deuxième option signifie que votre reader sera fermé en cas d'exception après sa création, il est donc préférable.

Il est effectivement transformé par le compilateur en:

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

Voir MSDN pour plus d'informations.

33
Daniel Kelley

Vous pouvez réellement répertorier les utilisations ensemble, à 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

Ne serait-il pas plus simple d'utiliser ce code?

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

Cela devrait éliminer le lecteur, ainsi que la connexion et la commande implicites lorsque l'utilisation est terminée.

Ou ai-je raté quelque chose?

1
SimonA