Todos sabemos que retornar DataReaders através de funções é um tanto quanto perigoso, pois o DataReader exige uma conexão ativa com a base de dados e delega ao consumidor do método fechar a conexão com o mesmo explicitamente. Apesar de perigoso, há um cenário onde retornar DataReaders é muito comum, ou seja, quando estavamos desenvolvendo uma DAL, um dos principais métodos é o ExecuteReader, a menos que voce somente trabalhe com Datasets 😛
Keith Brown dá uma solução muito elegante para continuar retornando DataReaders através de funções, porém a responsabilidade em fechar o mesmo, fica dentro da própria classe, evitando assim que o DataReader fique aberto, prejudicando a aplicação. A solução é a utilização de um delegate que, em sua assinatura, recebe um parametro do tipo XXXDataReader. Se estivermos consumindo a classe a partir do C#, podemos optar por utilizar um método anonimo para as coisas ficarem ainda mais bonitas:
DalHelper dal = new DalHelper(Util.Settings.DbConnectionString);
dal.ExecuteSecureReader(“SELECT Nome FROM Clientes”, CommandType.Text,
delegate(DbDataReader dr)
{
while (dr.Read())
{
Response.Write(dr.GetString(0));
}
});
Se o consumo da classe for no VB.NET, voce consegue ter todos os beneficios com relação ao fechamento da conexão, mas precisará criar uma função a parte para tratar o resultado. Com certeza, o benefício vale mais do que 3 ou 4 linhas de código a mais. 😉
Boas Miguel,
Pode fazer algo como:
Dim dal As New DalHelper(Util.Settings.DbConnectionString)
dal.ExecuteSecureReader("SELECT Nome FROM Clientes", CommandType.Text, Listar)
Public SUb Listar(dr As DbDataReader)
While dr.Read()
End While
End Sub
Desculpe a ignorância, mas como ficaria em VB.NET?
Poderia dar um exemplo?