Si noti che l'eliminazione di un SqlDataReader istanziato utilizzando SqlCommand.ExecuteReader () non chiuderà / eliminerà la connessione sottostante.
Esistono due modelli comuni. Nella prima, il lettore viene aperto e chiuso nell'ambito della connessione:
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
A volte è conveniente che un metodo di accesso ai dati apra una connessione e restituisca un lettore. In questo caso è importante che il lettore restituito venga aperto utilizzando CommandBehavior.CloseConnection, in modo che la chiusura / eliminazione del lettore chiuderà la connessione sottostante. Il modello è simile a questo:
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;
}
}
e il codice chiamante deve solo disporre il lettore così:
using(SqlDataReader reader = ExecuteReader(...))
{
... do your stuff ...
} // reader and connection are closed here.