VB .NET - Localizando e exibindo dados em um DataGridView (para novatos)


Este é um artigo para quem esta iniciando com a linguagem VB .NET e mostra como localizar informações em um banco de dados e exibi-las em um controle DataGridView.

Neste artigo você vai aprender a :

Requisitos:

Objetivos

O objetivo é criar uma aplicação Windows Forms onde o usuário poderá localizar informações de um banco de dados digitando o critério em um controle TextBox a partir da qual será realizada uma consulta SQL na tabela do banco de dados e o resultado será retornado no formato de um dataset ou datatable sendo exibido em um controle DataGridView.

Criando o projeto no Visual Studio 2012 Express for desktop

Abra o Visual Studio 2012 Express for dekstop e clique em New Project;

Selecione a linguagem Visual Basic -> Windows e o template Windows Forms Application e informe o nome LocalizandoDados e clique em OK;

No formulário form1.vb inclua os seguintes controles a partir da ToolBox:

Disponha os controles no formulário conforme o leiaute abaixo:

Vamos incluir uma referência no projeto ao namespace System.Configuration que será usado para acessar as informações do arquivo App.Config.

No menu PROJECT clique em Add Reference e a seguir selecione o item System.Configuration e clique no botão OK;

Agora vamos incluir uma classe no projeto com o nome DAL.vb onde iremos colocar o código que acessa e retorna as informações do banco de dados. Assim estamos separando as responsabilidades não incluindo este código no formulário do projeto.

No menu PROJECT clique em Add Class;

A seguir selecione o template Class, informe o nome DAL.vb e clique no botão Add;

Antes de definirmos o código da classe DAL vamos incluir no arquivo App.Config a string de conexão usada para acessar o banco de dados pois iremos recuperá-la a partir do arquivo de configuração. Dessa forma evitamos de inserir a string de conexão no código.

Abra o arquivo App.Config e inclua as linhas destacadas em azul mostradas abaixo onde estamos especificando o provedor usado e o caminho do banco de dados.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <appSettings>
    <add key="conexao_MSAccess" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\dados\Northwind.mdb" />
  </appSettings>
</config

A string de conexão será identificada pelo nome conexao_MSAccess.

Agora podemos incluir o código na classse DAL conforme a seguir:

Imports System.Data
Imports System.Data.OleDb

Public Class DAL
    
    Shared connection As OleDbConnection
    
    Public Sub New()
        connection = New OleDbConnection()
        connection.ConnectionString = System.Configuration.ConfigurationManager.AppSettings("conexao_MSAccess")
    End Sub

    Public Function getTabelaViaAdapter(consultaSQL As String) As DataTable
        Try
            connection.Open()
            Dim dt As New DataTable()
            Dim da As OleDbDataAdapter = New OleDbDataAdapter(consultaSQL, connection)
            da.Fill(dt)
            If dt.Rows.Count = 0 Then
                Throw New Exception("Não foram localizados dados para este critério.")
            End If
            Return dt
        Catch ex As Exception
            Throw ex
        Finally
            connection.Close()
        End Try
    End Function

    Public Function getTabelaViaReader(ByVal consultaSQL As String) As DataTable
        Try
            connection.Open()
            Dim dt As New DataTable()
            Dim cmd As New OleDbCommand(consultaSQL, connection)
            Dim reader As OleDbDataReader = cmd.ExecuteReader()
            dt.Load(reader)
            If dt.Rows.Count = 0 Then
                Throw New Exception("Não foram localizados dados para este critério.")
            End If
            Return dt
        Catch ex As Exception
            Throw ex
        Finally
            connection.Close()
        End Try
    End Function

    Public Function getDataSet(ByVal consultaSQL As String) As DataSet
        Try
            connection.Open()
            Dim dadapter As New OleDbDataAdapter(consultaSQL, connection)
            Dim dset As New DataSet()
            dadapter.Fill(dset)
            Return dset
        Catch ex As Exception
            Throw ex
        Finally
            connection.Close()
        End Try
    End Function
End Class
Nesta classe temos 3 métodos definidos:
  1. getTabelaViaAdapter - Retorna um DataTable obtido via DataAdapter
  2. getTabelaViaReader - Retorna um DataTable obtido via DataReader
  3. getDataSet - Retorna um DataSet

Estamos obtendo a string de conexão do arquivo App.Config no construtor da classe DAL Sub New().

A variável connection foi definida como shared o que significa que ela é uma variável  estática e não depende da instância da classe.

Agora vamos definir o código do formulário form1.vb.

No início do formulário vamos declarar a variável strSql que será usada no formulário para armazenar a consulta SQL usada para obter os dados.

Dim strSql As String

No evento Load do formulário vamos ocultar o groupBox que exibe o resultado da consulta definido a propriedade Visible deste controle como False:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
      grpResultado.Visible = False
End Sub

Neste formulário temos 3 TextBox a partir do qual o usuário poderá definir um critério para localizar os nomes dos contatos na tabela Customers.

1- No primeiro TextBox - txtNomeContato - o usuário deverá digitar o nome completo de um contato e clicar no botão Procurar.

 Private Sub btnLocalizar_Click(sender As Object, e As EventArgs) Handles btnLocalizar.Click
        If txtNomeContato.Text = "" Or txtNomeContato.Text = " " Then
            ErrorProvider1.SetError(txtNomeContato, "Informe o nome do contato.")
            Return
        Else
            Try
                strSql = "select * from Customers Where ContactName ='" & txtNomeContato.Text & "'"
                Dim dal As New DAL
                gdvResultado.DataSource = dal.getTabelaViaAdapter(strSql)
                txtNomeContato.Clear()
                grpResultado.Visible = True
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End If
    End Sub

Neste código a instrução SQL usada - "select * from Customers Where ContactName ='" & txtNomeContato.Text & "'" será usada pelo método getTabelaViaAdapter após criarmos uma instância da classe DAL e que retornará um objeto DataTable.

2- No segundo TextBox - txtLetraNomeContato - o usuário poderá digitar apenas uma letra do nome do contato. O evento TextChanged irá disparar o código para localizar as informações.

Private Sub txtLetraNomeContato_TextChanged(sender As Object, e As EventArgs) Handles txtLetraNomeContato.TextChanged
        If txtLetraNomeContato.Text.Contains(" ") Then
            ErrorProvider1.SetError(txtLetraNomeContato, "Informe a letra do nome do contato.")
            Return
        Else
            Try
                strSql = "select * from Customers Where ContactName like '" & txtLetraNomeContato.Text & "%'"
                Dim dal As New DAL
                gdvResultado.DataSource = dal.getTabelaViaAdapter(strSql)
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End If
        grpResultado.Visible = True
    End Sub

Neste código a instrução SQL - "select * from Customers Where ContactName like '" & txtLetraNomeContato.Text & "%'" - utiliza o cláusula Like de forma que serão retornados todos os contatos cujo nome se iniciam pela letra informada.

O método getTabelaViaAdapter(strSql) retorna um DataTable.

3- No terceiro TextBox - txtContatoNome - o usuário poderá digitar o nome completo do contato. O evento TextChanged irá disparar o código para localizar as informações.

Private Sub txtContatoNome_TextChanged(sender As Object, e As EventArgs) Handles txtContatoNome.TextChanged
        If txtContatoNome.Text = "" Then
            ErrorProvider1.SetError(txtContatoNome, "Informe o nome completo do contato.")
            Return
        Else
            Try
                strSql = "select * from Customers Where ContactName ='" & txtContatoNome.Text & "'"
                Dim dal As New DAL
                gdvResultado.DataSource = dal.getDataSet(strSql).Tables(0)
                txtLetraNomeContato.Clear()
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End If
        grpResultado.Visible = True
    End Sub

Neste código a instrução SQL usada - "select * from Customers Where ContactName ='" & txtNomeContato.Text & "'" será usada pelo método getTabelaViaAdapter após criarmos uma instância da classe DAL e que retornará um objeto DataSet.

Considerações sobre o Código

Nosso objetivo foi mostrar como usar ADO .NET para localizar informações acessando um banco de dados Microsoft Access usando os objetos DataTable e DataSet.

Nosso exemplo mostrou como fazer isso e esta funcional mas isso não quer dizer que a abordagem usada é a mais adequada.

Na verdade retornar um DataTable ou DataSet na maioria dos cenários é uma prática desaconselhada (a não ser para protótipos ou sistemas bem simples e pessoais).

O que devemos fazer então ???

Devemos retornar uma coleção de objetos.

Para isso vamos criar uma classe chamada Customer e definir 5 propriedades que representam as colunas da tabela Customers:

No menu PROJECT clique em Add Class;

A seguir selecione o template Class, informe o nome Customer.vb e clique no botão Add e inclua o código abaixo nesta classe:

Public Class Customer

    Public Property CustomerID As String
    Public Property CompanyName As String
    Public Property ContactName As String
    Public Property ContactTitle As String
    Public Property Address As String
    Public Property City As String

End Class

Depois vamos incluir na classe DAL o método getCustomers() que irá retornar uma lista de objetos Customer:

 Public Function getCustomers(ByVal consultaSQL As String) As List(Of Customer)

        Dim contatos As New List(Of Customer)
        Dim contato As Customer
        Try
            connection.Open()
            Dim dt As New DataTable()
            Dim da As OleDbDataAdapter = New OleDbDataAdapter(consultaSQL, connection)
            da.Fill(dt)
            If dt.Rows.Count = 0 Then
                Throw New Exception("Não foram localizados dados para este critério.")
            End If

            For Each linha As DataRow In dt.Rows
                contato = New Customer
                contato.CustomerID = linha("CustomerID")
                contato.CompanyName = linha("CompanyName")
                contato.ContactName = linha("ContactName")
                contato.ContactTitle = linha("ContactTitle")
                contato.Address = linha("Address")
                contato.City = IIf(IsDBNull(linha("City")), "", linha("City"))
                contatos.Add(contato)
            Next

            Return contatos

        Catch ex As Exception
            Throw ex
        Finally
            connection.Close()
        End Try
    End Function

Neste código estamos usando List(Of T) que representa uma lista fortemente tipada de objetos que pode ser acessada via índice e fornece métodos para procurar, ordenar e manipular a lista.

No nosso exemplo T representa a classe Customer. O método getCustomers() irá retornar uma coleção de objetos Customer conforme definimos na classe Customer.

Para preencher a lista de objetos percorremos o DataTable obtido e preenchemos os valores da classe contato que é um instância de Customer e incluímos o contato na lista representada por contatos.

Essa abordagem é a mais indicada para a maioria dos cenários.

Pegue o projeto completo aqui: LocalizandoDados.zip

João 11:35 Jesus chorou.

Referências:


José Carlos Macoratti