Należy zauważyć, że usunięcie SqlDataReader utworzonego za pomocą SqlCommand.ExecuteReader () nie spowoduje zamknięcia / usunięcia podstawowego połączenia.
Istnieją dwa wspólne wzorce. W pierwszym czytnik jest otwierany i zamykany w ramach połączenia:
using(SqlConnection connection = ...)
{
connection.Open();
...
using(SqlCommand command = ...)
{
using(SqlDataReader reader = command.ExecuteReader())
{
... do your stuff ...
}
}
}
Czasami wygodnie jest mieć metodę dostępu do danych, otwierającą połączenie i zwracającą czytnik. W takim przypadku ważne jest, aby zwrócony czytnik został otwarty za pomocą CommandBehavior.CloseConnection, aby zamknięcie / usunięcie czytnika zamknęło podstawowe połączenie. Wzór wygląda mniej więcej tak:
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;
}
}
a kod wywołujący musi po prostu pozbyć się czytnika w ten sposób:
using(SqlDataReader reader = ExecuteReader(...))
{
... do your stuff ...
}