VB.NET: Criando um DataReader sobre uma conexão genérica


Geralmente quando você vai criar um DataReader precisa definir qual a conexão vai utilizar : OleDbConnection ou SqlConnection ?

Que tal criar um classe que faça este serviço independente da conexão que foi usada ? Vamos lá...

Para você entender melhor o que vamos fazer você tem que saber o que é uma interface.

Uma interface possui somente métodos que não estão implementados e que devem ser implementados pela classe que usar a interface.

Para implementar uma interface o VB.NET usa o modificador - Implements .

As interfaces são declaradas usando a palavra-chave - Interface. Geralmente o nome dado a uma interface começa com a letra I

No nosso código vamos usar duas interfaces: IDataReader e IDbConnection.

As classes OleDbDataReader e SqlDataReader implementam a interface IDataReader e as classes OleDbConnection e SqlConnection usam a interface IDbConnection.

A interface IDataReader permite que uma classe a herde para implementar a classe DataReader. Você não cria uma instância da interface diretamente mas cria uma instância de uma classe que implementa a interface IDataReader.

As classes que usam interface IDataReader devem implementar os membros definidos na interface.

Vamos então criar um novo projeto no VS.NET do tipo Windows Application usando o VB.NET.

Após dar um nome ao projeto e salvá-lo vamos incluir um arquivo de classe no projeto através do menu Project|Add Class.

Informe o nome deste arquivo como CriarDataReader.vb e inclua o código abaixo no arquivo:

Public Class CriaDataReader
 

Function criaDataReader(ByVal conexao As System.Data.IDbConnection, _ ByVal sql As String) As System.Data.IDataReader "cria um objeto commandbehavior e atribui a enumeracao padrao
 

  Dim cmdBehavior As CommandBehavior = CommandBehavior.Default "abre a conexao se necessário


  If conexao.State <> ConnectionState.Open Then "abre a conexão se estiver fechada

       conexao.Open() "define o comportamento para quando o datareader foi utilizado

      cmdBehavior = CommandBehavior.CloseConnection

  End If "prepara a string sql para selecionar dados
 

  Dim comando As System.Data.IDbCommand = conexao.CreateCommand()

  comando.CommandText = sql "cria um datareader e força o comportamento desejado

  Dim dr As System.Data.IDataReader = comando.ExecuteReader(cmdBehavior) "fecha o objeto commando e retorna o resultado

  comando.Dispose()

  Return dr

End Function

End Class

Vamos explicar o código passo a passo:

Nesta classe criamos a função criarDataReader que retorna um objeto do tipo IDataReader.

A função esta preparada para receber dois parâmetros:

1- conexao As System.Data.IDbConnection - conexão pode ser um objeto OleDbCConnection ou SqlConnection pois ambos implementam a interface IDbConenction
2- sql As String - sql é a string que representa um comando SQL que será executado para criar o DataReader

- Criando um objeto CommandBehavior

Dim cmdBehavior As CommandBehavior = CommandBehavior.Default

Cria um objeto CommandBehavior atribuindo a ele o valor da Default.

CommandBehavior é uma Enumeration que fornece uma descrição do resultados de uma consulta e seus efeitos no banco de dados.Os valores de CommandBehavior são usados pelo método ExecuteReader da interface IDbCommand e das classes derivadas dela.

Alguns dos valores de commandBehavior :

Valores Descrição
SchemaOnly Retorna somente informações das colunas e não afeta o estado do banco de dados.
Default A consulta pode retornar multiplos result sets e a execução da consulta pode afetar o estado do banco de dados. Usar ExecuteReader(CommandBehavior.Default) é a mesma coisa que usar ExecuteReader().
 
SequentialAccess Indica que os campos apenas serão acessados na mesma ordem em que foram trazidos, nunca fora de ordem.
SingleRow Indica que apenas um registro será retornado, quer seja em um único resultSet ou em vários.
SingleResult
Indica que apenas um resultSet será retornado.
CloseConnection Quando o comando é executado o objeto Connection associado é fechado quando o objeto DataReader associado for fechado.

Você pode fazer uma combinação destes valores do commandBehavior:

dr=cmd.executeReader(CommandBehavior.SingleRow + CommandBehavior.SingleResult + CommandBehavior.SequentialAccess)

- Verificando se a conexão esta aberta

"abre a conexao se necessário
If conexao.State <> ConnectionState.Open Then
   "abre a conexão se estiver fechada
   conexao.Open()
   "define o comportamento para quando o datareader foi utilizado
   cmdBehavior = CommandBehavior.CloseConnection
End If

Estamos usando o método State do objeto Connection para verificar se a conexão esta aberta. Se não estiver aberta abrimos a conexão e definimos o commandBehavior

- Criando um objeto Commando associado com a conexão

"prepara a string sql para selecionar dados
Dim comando As System.Data.IDbCommand = conexao.CreateCommand()
comando.CommandText = sql

Aqui usamos o método CreateCommand() da interface IdbConnection para criar e retornar um objeto Command associado a conexão usada.

A propriedade CommandText da interface IdbCommand define um texto para o command que irá ser executado contra o banco de dados.

- Criando um DataReader

"cria um datareader e força o comportamento desejado
Dim dr As System.Data.IDataReader = comando.ExecuteReader(cmdBehavior)

O método ExecuteReader da interface IDbCommand executa o CommandText na conexão e constrói um IDataReader.

- Libera os recursos usados pelo Command e retorna o DataReader

fecha o objeto commando e retorna o resultado
comando.Dispose()
Return dr

Vamos agora testar a classe que criamos . No mesmo projeto use o formulário padrão - form1.vb - que já foi criado e insira os seguintes componentes:(Conforme figura abaixo)

No evento Click do CommandButton insira o seguinte código :

Private Sub btncriaDataReader_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btncriaDataReader.Click

Dim myConnection As New OleDbConnection(txtConexao.Text)
Dim meudr As New ConexoesNET Dim dr As OleDbDataReader = meudr.criaDataReader(myConnection, txtSQL.Text)

While dr.Read()

    ListBox1.Items.Add(dr.Item(0) & " - " & dr.Item(1))

End While

End Sub

Acima eu estou testando a utilização do método criaDataReader da classe ConexoesNET que criamos.

Após gerar o DataReader estou preenchendo um controle ListBox para exibir os dados retornados.

Nota: Eu não posso usar um DataGrid pois o objeto DataReader não implementa a interface IList.

O teste foi feito usando uma conexão OleDbConnection mas pode ser feito usando uma conexão SqlConnection.

O resultado obtido é o seguinte :

Até o próximo artigo

Referências:


José Carlos Macoratti