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 MacorattiGeralmente 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:
- Entity Framework 4: Repositório GenéricoVisual Basic .NET
- As edições 14 da Easy .net Magazine e 88 da .net Magazine já estão disponíveis.ADO.NET
- Postando no Twiiter com .NET e Migre.meC#
- Setup ApplicationsVisual Basic .NET
- Problemas na manipulação de arquivos do MS Excel com .NETVisual Basic .NET