Notez que l'élimination d'un SqlDataReader instancié à l'aide de SqlCommand.ExecuteReader() aura pour effet de no fermer/éliminer la connexion sous-jacente.
Il existe deux modèles courants. Dans le premier, le lecteur est ouvert et fermé dans le cadre de la connexion :
using(SqlConnection connection = ...)
{
connection.Open();
...
using(SqlCommand command = ...)
{
using(SqlDataReader reader = command.ExecuteReader())
{
... do your stuff ...
} // reader is closed/disposed here
} // command is closed/disposed here
} // connection is closed/disposed here
Il est parfois pratique de demander à une méthode d'accès aux données d'ouvrir une connexion et de renvoyer un lecteur. Dans ce cas, il est important que le lecteur renvoyé soit ouvert à l'aide de CommandBehavior.CloseConnection, de sorte que la fermeture/disposition du lecteur entraîne la fermeture de la connexion sous-jacente. Le modèle ressemble à ceci :
public SqlDataReader ExecuteReader(string commandText)
{
SqlConnection connection = new SqlConnection(...);
try
{
connection.Open();
using(SqlCommand command = new SqlCommand(commandText, connection))
{
return command.ExecuteReader(CommandBehavior.CloseConnection);
}
}
catch
{
// Close connection before rethrowing
connection.Close();
throw;
}
}
et le code appelant n'a plus qu'à se débarrasser du lecteur :
using(SqlDataReader reader = ExecuteReader(...))
{
... do your stuff ...
} // reader and connection are closed here.