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