VB
.NET - Criando um formulário de consulta
Neste artigo eu mostro como criar um formulário básico para consultas com ADO .NET e utilizando uma arquitetura em camadas.
Abaixo temos o formulário do projeto:
![]() |
Os controles usados no
formulário são:
|
Ao iniciar a aplicação os dados da tabela que desejamos consultar serão exibidos no DataGridView e o controle ComboBox - cboCampo - será preenchido com os nomes dos campos da tabela:
![]() |
![]() |
Ao selecionar um campo da ComboBox - cboCampo , a outra combobox CboParametro exibirá os valores relacionados conforme a tabela abaixo:
| Campo do tipo String | Campo do tipo Integer | ||||||||||
|
|
||||||||||
tabela 1.0 |
|||||||||||
Em seguida basta informar o valor desejado para que string SQL seja montada e executada para obter os valores da consulta desejada.
Vou usar o Visual Basic 2008 Express Edition e o banco de dados SQL Server 2005 Express Edition.
Neste exemplo eu vou usar o banco de dados Macoratti.mdf e a usar a tabela Clientes.
![]() |
A string de conexão para o banco de dados usado no exemplo é a seguinte:
Data Source=.\SQLEXPRESS;AttachDbFilename="C:\DadosMacoratti.mdf";Integrated Security=True;Connect Timeout=30;User Instance=True
Você pode obter a string de conexão criando uma nova conexão no DataBase Explorer, selecionando o banco de dados e visualizar o valor da propriedade Connection String na janela de Propriedades.
Vocé pode armazenar a string de conexão no arquivo App.Config conforme abaixo:
<applicationSettings>
<ConsultaNet.My.MySettings>
<setting name="conexaoBD" serializeAs="String">
<value>Data Source=.\SQLEXPRESS;AttachDbFilename="C:\Dados\Macoratti.mdf";Integrated Security=True;Connect Timeout=30;_
User Instance=True</value>
</setting>
</ConsultaNet.My.MySettings>
</applicationSettings>
|
Obs: Para criar o App.Config e ter incluida a string de conexão conforme acima no menu Data selecione a opção Add New Data Source... e siga as orientações do assistente até salvar a string de conexão. Em seguida exclua o dataset gerado pois não será usado neste aplicação.
Pode também definir a string de conexão no seu projeto clicando em My Project e na guia Configurações(Settings) definir um nome, tipo, escopo e valor para a string de conexão conforme a figura abaixo:
![]() |
Na aplicação exemplo deste artigo eu vou usar esta última forma onde defini a variável conexaoBD contendo o valor da string de conexão. Ela será acessada via recurso My.Settings.
Nesta aplicação vamos usar uma arquitetura em camadas de forma a ter um código mais organizado de fácil manutenção e reutilização.
Para isso vamos criar uma estrutura da seguinte forma:
![]() |
Nesta arquitetura temos que:
Podemos definir esta estrutura criando 3 projetos distintos ou em um mesmo projeto criar uma classe para a camada de negócios(BLL) e outra classe para a camada de acesso a dados (DAL). No nosso exemplo irei usar esta última opção.
Abra o Visual Basic 2008 Express Edition e crie um novo projeto do tipo Windows Application usando a linguagem Visual Basic com o nome ConsultaNet;
A seguir vamos incluir uma nova classe no projeto, para isso clique com o botão direito do mouse sobre o nome do projeto e selecionando a opção Add -> New Item;
A seguir selecione o template Class e informe o nome DAL para a classe. Esta classe irá conter o código de acesso a dados.
Repita o procedimento acima e inclua uma nova classe com o nome ClienteBLL que deverá conter o código da lógica de negócio da aplicação.
O projeto deverá possuir neste momento a seguinte estrutura:
![]() |
Definindo o código da camada de acesso a dados (DAL)
A classe DAL vai conter o código da camada de acesso a dados. Esta camada deve saber tudo sobre acesso a dados e para isso deverá conter os namespaces System.Data e System.Data.SqlClient.
Definimos o namespace DAL para esta classe e definimos a classe AcessoBD com os seguintes métodos:
Imports System.Data
Imports System.Data.SqlClient
Namespace DAL
Public Class AcessoBD
Dim strConexao As String = My.Settings.conexaoBD
Private Function openConexao() As SqlConnection
Dim cn As New SqlConnection
cn.ConnectionString = strConexao
cn.Open()
Return cn
End Function
Private Sub closeConexao(ByVal cn As SqlConnection)
If cn.State = ConnectionState.Open Then
cn.Close()
End If
End Sub
Public Sub ExecuteComando(ByVal consulta As String)
Dim cn As New SqlConnection()
Try
cn = openConexao()
Dim cmdCommand As New SqlCommand
With cmdCommand
.CommandText = consulta.ToString
.CommandType = CommandType.Text
.Connection = cn
.ExecuteNonQuery()
End With
Catch ex As Exception
Throw
Finally
closeConexao(cn)
End Try
End Sub
Public Function GetDataSet(ByVal consulta As String) As DataSet
Dim cn As New SqlConnection()
Try
cn = openConexao()
Dim cmdCommand As New SqlCommand
With cmdCommand
.CommandText = consulta.ToString
.CommandType = CommandType.Text
.Connection = cn
.ExecuteNonQuery()
End With
Dim da As New SqlDataAdapter
Dim ds As New DataSet
With da
.SelectCommand = cmdCommand
.Fill(ds)
End With
Return ds
Catch ex As Exception
Throw
Finally
closeConexao(cn)
End Try
End Function
Public Function GetDataReader(ByVal consulta As String) As SqlDataReader
Dim cn As New SqlConnection()
Try
cn = openConexao()
Dim cmdCommand As New SqlCommand
With cmdCommand
.CommandText = consulta.ToString
.CommandType = CommandType.Text
.Connection = cn
End With
Return cmdCommand.ExecuteReader
Catch ex As Exception
Throw
Finally
closeConexao(cn)
End Try
End Function
End Class
End Namespace
|
Dessa forma temos pronto o código para realizar as operações básicas de acesso a dados na nossa aplicação.
Definindo o código da camada de lógica de negócios (BLL)
A classe clienteBLL irá conter o código da lógica de negócio que nosso exemplo será bem simples. Ela conterá dois métodos:
Ambos os métodos são chamados a partir de uma instância da camada de acesso a dados (dal).
Observe que os métodos e variáveis dessa classe são estáticas (shared) e portanto não precisam que uma instância da classe seja criada para serem invocadas.
A classe utiliza o namespace ConsultaNet.DAL pois necessita ter acesso aos métodos da classe DAL.
Imports ConsultaNet.DAL
Namespace BLL
Public Class ClienteBLL
Private Shared dal As AcessoBD
Public Shared Function getClientes(ByVal consulta As String) As DataSet
dal = New AcessoBD
Return dal.GetDataSet(consulta)
End Function
Public Shared Function pesquisaClientes(ByVal Campo As String, ByVal Parametro As String, _
ByVal Valor As String, ByVal tipo As String) As DataSet
Dim sql As String = "SELECT * From Clientes WHERE " & Campo & " " & Parametro & " " & Valor
dal = New AcessoBD
Return dal.GetDataSet(sql)
End Function
End Class
End Namespace
|
Definindo o código da camada de interface (UI)
Camada de interface irá exibir as informações e permitir a interação com o usuário. Ela deverá acessar a camada de negócios (BLL) que por sua vez acessará a camada de acesso a dados (DAL) que por sua vez acessa os dados e retorna o resultado ou realiza a operação desejada.
Como esta camada vai usar os métodos da camada de negócios (BLL) devemos declarar o seguine namespace no formulário:
Imports ConsultaNet.BLL
Em seguida vamos definir o seguinte código no formulário:
Dim tipoCampo As Type
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim i As Integer
Dim ds As New DataSet
ds = ClienteBLL.getClientes("Select * from Clientes")
cboCampo.Items.Clear()
For i = 0 To ds.Tables(0).Columns.Count - 1
cboCampo.Items.Add(ds.Tables(0).Columns(i).ColumnName.ToString)
Next i
Me.gdvConsulta.AutoGenerateColumns = True
Me.gdvConsulta.DataSource = ds.Tables(0)
End Sub
Private Sub cboCampo_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles cboCampo.SelectedIndexChanged
Dim ds As New DataSet
tipoCampo = Me.gdvConsulta.Columns(cboCampo.SelectedIndex).ValueType
If tipoCampo.ToString = "System.Int32" Then
cboParametro.Items.Clear()
cboParametro.Items.Add("=")
cboParametro.Items.Add(">")
cboParametro.Items.Add(">=")
cboParametro.Items.Add("<")
cboParametro.Items.Add("<=")
cboParametro.Items.Add("<>")
End If
If tipoCampo.ToString = "System.String" Then
cboParametro.Items.Clear()
cboParametro.Items.Add("=")
cboParametro.Items.Add("Começa com")
cboParametro.Items.Add("Termina em")
cboParametro.Items.Add("Contém")
End If
End Sub
Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click
Dim campo As String = cboCampo.Text
Dim parametro As String = cboParametro.Text
Dim valor As String = txtValor.Text
Dim tipo As String = tipoCampo.ToString
Dim ds As New DataSet
If tipo = "System.String" Then
If parametro = "Tem a palavra" Then
parametro = "Like "
valor = "%" & valor & "%"
End If
If parametro = "=" Then
valor = "" & valor & ""
End If
If parametro = "Começa com" Then
parametro = "Like "
valor = "" & valor & "%"
End If
If parametro = "Termina em" Then
parametro = "Like "
valor = "%" & valor & ""
End If
End If
ds = ClienteBLL.pesquisaClientes(campo, parametro, valor, tipo)
Me.gdvConsulta.AutoGenerateColumns = True
Me.gdvConsulta.DataSource = ds.Tables(0)
End Sub
|
Vamos entender o código:
No evento Load do
formulário criamos um dataset e acessamos o método getClientes
da camada de negócios - ClienteBLL passando
como parâmetro a instrução SQL=(Select * from Clientes);
ds = ClienteBLL.getClientes("Select * from
Clientes")
Note que não necessitamos criar uma instância da
classe ClienteBLL pois o método getClientes é estático (Shared)
- Limpamos a combobox - cboCampo.Items.Clear()
- Percorremos as colunas da tabela retornada pelo dataset e preenchemos a combobox com os nomes dos campos:
For i = 0 To
ds.Tables(0).Columns.Count - 1
cboCampo.Items.Add(ds.Tables(0).Columns(i).ColumnName.ToString)
Next i
- Exibimos o dataset retornado no DataGridView:
Me.gdvConsulta.AutoGenerateColumns
= True
Me.gdvConsulta.DataSource = ds.Tables(0)
No evento SelectedIndexChanged da combobox que ocorre sempre que
um item for selecionado, iremos obter o tipo de campo selecionado
e se o mesmo for do tipo string iremos preencher a combobox com
os valores mostrados na tabela 1.0.
No evento Click do botão OK verificamos o tipo do item selecionado e conforme o seu conteúdo definimos os parâmetros : parametro e valor como Like e/ou % para montar a instrução SQL:
| If
tipo = "System.String" Then If parametro = "Tem a palavra" Then parametro = "Like " valor = "%" & valor & "%" End If If parametro = "=" Then valor = "" & valor & "" End If If parametro = "Começa com" Then parametro = "Like " valor = "" & valor & "%" End If If parametro = "Termina em" Then parametro = "Like " valor = "%" & valor & "" End If End If |
Em seguida chamamos o metódo pesquisaClientes passando o parâmetros definidos como critério para pesquisa. Será retornado o dataset contendo os registros que atendem o critério que serão exibidos no DataGridView:
ds =
ClienteBLL.pesquisaClientes(campo, parametro, valor, tipo)
Me.gdvConsulta.AutoGenerateColumns = True
Me.gdvConsulta.DataSource = ds.Tables(0)
Executando o projeto e definindo um
critério onde o campo nome contém a letra M, conforme abaixo,
iremos obter como resultado:
![]() |
Serão exibidos apenas os registros que atendem o critério definido.
Nota: Voce pode
evitar que o formulário seja fechado acidentalmente
definindo o seguinte código no evento FormClosing()
do formulário
|
Pegue o projeto completo aqui:
ConsultaNet.zip
Eu sei é apenas VB .NET, mas eu
gosto... ![]()
Referências:
José Carlos Macoratti