Retorno de DataReaders – Solução Elegante


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. 😉

Anúncios

2 comentários sobre “Retorno de DataReaders – Solução Elegante

  1. 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

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s