Tente evitar o uso de leitores como este:
SqlConnection connection = new SqlConnection("connection string");
SqlCommand cmd = new SqlCommand("SELECT * FROM SomeTable", connection);
SqlDataReader reader = cmd.ExecuteReader();
connection.Open();
if (reader != null)
{
while (reader.Read())
{
//do something
}
}
reader.Close(); // <- too easy to forget
reader.Dispose(); // <- too easy to forget
connection.Close(); // <- too easy to forget
Em vez disso, envolva-os em instruções:
using(SqlConnection connection = new SqlConnection("connection string"))
{
connection.Open();
using(SqlCommand cmd = new SqlCommand("SELECT * FROM SomeTable", connection))
{
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader != null)
{
while (reader.Read())
{
//do something
}
}
} // reader closed and disposed up here
} // command disposed here
} //connection closed and disposed here
A instrução using irá garantir o descarte correto do objeto e a liberação de recursos.
Se você esquecer, está deixando a limpeza para o coletor de lixo, o que pode demorar um pouco.
Observe que descartar um SqlDataReader instanciado usando SqlCommand.ExecuteReader () não fechará / descartará a conexão subjacente.
Existem dois padrões comuns. Na primeira, o leitor é aberto e fechado no âmbito da conexão:
Às vezes, é conveniente ter um método de acesso a dados para abrir uma conexão e retornar um leitor. Nesse caso, é importante que o leitor retornado seja aberto usando CommandBehavior.CloseConnection, para que fechar / descartar o leitor feche a conexão subjacente. O padrão é mais ou menos assim:
e o código de chamada precisa apenas dispor o leitor assim:
fonte
using
s, chame dispose nofinally {}
bloco após a captura. Da forma como isso é escrito, comandos bem-sucedidos nunca seriam fechados ou descartados.Para ser seguro, envolva cada objeto SqlDataReader em uma instrução using .
fonte
Apenas envolva seu SQLDataReader com a instrução "using". Isso deve cuidar da maioria dos seus problemas.
fonte