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