Desenvolvimento - Visual Basic .NET

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?

por José Carlos Macoratti



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 FunctionEnd 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)

  • 2 Labels
  • 2 TextBox - txtConexao e txtSQL
  • 1 CommandButton - btncriaDataReader
  • 1 GroupBox
  • 1 ListBox

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:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdataidatareaderclasstopic.asp

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdataidbcommandclasstopic.asp

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdataidbconnectionclasstopic.asp

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdatacommandbehaviorclasstopic.asp

José Carlos Macoratti

José Carlos Macoratti