Tenga en cuenta que eliminar un SqlDataReader instanciado mediante SqlCommand.ExecuteReader () no cerrará / eliminará la conexión subyacente.
Hay dos patrones comunes. En el primero, el lector se abre y se cierra dentro del alcance de la conexión:
using(SqlConnection connection = ...)
{
connection.Open();
...
using(SqlCommand command = ...)
{
using(SqlDataReader reader = command.ExecuteReader())
{
... do your stuff ...
}
}
}
A veces es conveniente tener un método de acceso a datos para abrir una conexión y devolver un lector. En este caso, es importante que el lector devuelto se abra usando CommandBehavior.CloseConnection, de modo que cerrar / eliminar el lector cerrará la conexión subyacente. El patrón se parece a esto:
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
{
connection.Close();
throw;
}
}
y el código de llamada solo necesita disponer al lector de esta manera:
using(SqlDataReader reader = ExecuteReader(...))
{
... do your stuff ...
}