 VB
.NET - Criando um formulário de consulta
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
 
ConsultaNet.zip
Eu sei é apenas VB .NET, mas eu
gosto... 
Referências:
José Carlos Macoratti