segunda-feira, 29 de abril de 2013

Explorando o DataReader


O objetivo do artigo é explicar como e quais as melhores práticas para a manipulação e exibição de dados. A Plataforma .NET fornece um objeto chamado DataReader, o qual está contido dentro do Namespace System.Data e que por sua vez tem como finalidade resgatar os dados da base de dados da forma rápida possível.

As principais caracteristicas do DataReader são: foward-only (somente avança) e read-only (somente leitura).

Principais Metodos:
Close: Fecha o objeto IdataReader
GetSchemaTable: Retorna um objeto do tipo DataTable contendo as descrições das colunas contidas no DataReader
NextResult: Utilizado para processar múltiplos SQL Statements. Retorna True caso encontre um Statements e False caso contrário
Read: Avança o IDataReader para o próximo registro. O método retorna um valor Booeano indicando True se existem mais linhas e False caso contrário.É necessário chamar este método para ler os registros.

Para cada Provider temos um objeto DataReader específico e cada um destes DataReaders implementam a interface IDataReader. As classes são as seguintes: OdbcDataReader, OleDbDataReader, OracleDataReader, SqlCeDataReader e SqlDataReader. Cada uma destas classes implementam os métodos e propriedades da interface IDataReader de acordo com o seu Provider, pois a implementação varia para cada um deles.

Chamo a atenção para o método Read(). Enquanto estamos utilizando o DataReader é necessário termos uma conexão associada que por sua vez acessa a Fonte de Dados. Esta conexão deve estar ativa, pois o DataReader percorre diretamente a Fonte de Dados resgatando os dados de acordo com a Query. Esta conexão com a fonte de dados fica ativa até que você chame o método Close().

Já o método NextResult() utilizamos para verificar se existe um ou mais SQL Statements, pois se houver mais que um, utilizamos este método para mover para o próximo Statement, e assim poderemos avançar e percorrer os registros que podem ou não serem retornados por este Statement.


Inteface IDataReader:
Contém 4 propriedades e 4 métodos que devem ser implementados nas classes que implementar esta Interface.
Propriedades:
Depth: Retorna um valor maior que zero (0) caso existam linhas (rows). No caso do SQL Server, sempre será retornado 0, já que o mesmo não suporta esta funcionalidade
HasRows *: Esta propriedade (ReadOnly) retorna True se existe um ou mais registros, e False caso o DataReader não retorne nenhum registro
IsClosed: Verifica se o leitor está aberto ou fechado
RecordsAffected: Retorna o número de linhas modificadas, inseridas ou excluídas através da execução de SQL Statements
* A propriedade HasRows foi introduzida apenas na versão 1.1 do .NET Framework. Como as Interfaces são imutáveis, essa propriedade foi criada e implementada nas classes que implementam IDataReader, fazendo assim parte da classe e não da Interface.


Dicas de performance
Temos abaixo 3 exemplos de como recuperar dados de um DataReader
Qual melhor forma de acessar e resgatar os valores de uma determinada coluna?

1
2
3
Response.Write(objDr["Coluna"]);
Response.Write(objDr[0]);
Response.Write(objDr.GetString ( 0 ) ) ;

O método mais rápido é o segundo, que passa diretamente o valor inteiro que corresponde ao índice da coluna. Explicando: Quando passamos o nome da coluna, internamente ele chama o método GetOrdinal(...).Para depois chamar o método que realmente retorna o valor que chama-se GetValue().

Conclusão
Como vimos, o DataReader disponibiliza recursos para leitura de dados de forma conectada e rápida. Com ele garantimos uma perfomance muito maior no acesso e resgate aos dados de uma base de dados qualquer com relação ao objeto DataSet. Mas é preciso atentar a diversas regras e boas práticas para o uso do mesmo, para que algo tão poderoso e eficaz não se torne um problema, dificultando a manutenção e principalmente a eficácia e performance que ele nos fornece.

Nenhum comentário:

Postar um comentário