VB .NET - Realizando a navegação pelos registros no SQL Server, MySQL e Access


Este é um artigo básico para iniciantes, para aqueles que estão tentando migrar do VB6 para o VB .NET e estão confusos.

A minha primeira recomendação é que você migre o mais rápido possível pois o VB .NET já esta na sua versão 2010.

Uma das dúvidas para quem usava a ADO em aplicações de acesso dados no VB6 é que com a chegada do VB .NET alguns conceitos mudaram.

Uma das dúvidas freqüentes dos iniciantes é que não existe mais o objeto Recordset nem os seus métodos de navegação MoveNext, MovePrevious, MoveLast e MoveFirst.

Então , depois de realizar o acesso aos dados como eu posso navegar pelos registros ?

Antes eu usava os métodos MoveNext, MovePrevious, MoveLast e MoveFirst mas eles não existem na ADO .NET.

Este artigo vai mostrar como realizar a navegação pelos registros de uma tabela do banco de dados MS Access , SQL Server e MySQL usando ADO .NET.

Na segunda parte deste artigo eu pretendo mostrar como realizar as operações de atualização da base de dados usando ADO .NET.

Para tornar as coisas mais simples, pois como dizia Zecão : "Primeiro o arroz com feijão depois o camarão" , eu vou trabalhar com apenas uma tabela de nome Clientes que contém a seguinte estrutura:

Onde o campo id é uma chave primária auto-numeração no Access e do tipo Identity no SQL Server e os demais campos são todos do tipo String.

O formulário usado para exibir os dados e para fazer a navegação possui o leiaute mostrado na figura abaixo onde temos:

- 1 Controle DataGridView (gdvClientes);
- 5 Controles Label;
- 5 Controles TextBox (TextBox1,TextBox2,TextBox3,TextBox4 e TextBox5)
- 4 Controles Button:
  • btnPrimeiro , btnProximo, btnAnterior e btnUltimo

Nosso objetivo será acessar a tabela Clientes e exibir os registros nos controles do formulário.

Em seguida vamos realizare a navegação pelos registros usando os botões de comando :

Primeiro, Próximo, Anterior e Último.

Tudo muito simples explicado em detalhes que irritiriam os avançados mas que são necessários para
os iniciantes.

Ferramentas usadas neste artigo:

Agora vamos ao trabalho...

Criando o projeto no VB 2008 Express Edition

Abra o VB 2008 Express Edition e crie um novo projeto do tipo Windows Forms Application com o nome NavegacaoNet;

Vamos criar uma aplicação MDI e para isso vamos incluir um formulário MDI que será containter dos demais formulários.

No menu Project selecione Add Windows Form, e, a seguir selecione o template Windows Form, informe o nome frmMenu.vb e clique em Add;

Para tornar o formulário frmMenu como formulário pai defina a propriedade isMDIContainer do formulário como True;

Agora a partir da ToolBox inclua um componente MenuStrip no formulário frmMenu e a seguir defina o seguinte leiaute para este formulário:

Vamos agora definir o código que será executado quando as opções do menu forem selecionadas pelo usuário. Veja como ficou o código :

Public Class frmMenu
    Private Sub mnuItemAccess_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuItemAccess.Click
        Dim frm_filho As New Form1
        If IsNothing(frm_filho) = True Then
            MsgBox("O formulário já esta sendo exibido !", MsgBoxStyle.Exclamation)
        Else
            frm_filho.MdiParent = Me
            frm_filho.Show()
        End If
    End Sub

    Private Sub mnuItemSqlServer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuItemSqlServer.Click
        'Declaração da variável frmSqlServer (nome do form que vai ser chamado)
        Dim frm_filho As New Form2
        frm_filho.MdiParent = Me 'Permite que o Form Filho seja aberto dentro do Form MDI
        frm_filho.Show()         'Chama o Formulário filho
    End Sub

    Private Sub mnuItemMySQL_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuItemMySQL.Click
        'Declaração da variável frmSqlServer (nome do form que vai ser chamado)
        Dim frm_filho As New Form3
        frm_filho.MdiParent = Me 'Permite que o Form Filho seja aberto dentro do Form MDI
        frm_filho.Show()        'Chama o Formulário filho
    End Sub
End Class

Neste código para cada opção, primeiro estamos criando uma instância do formulário filho que desejamos exibir :

Dim frm_filho As New Form1 ou Dim frm_filho As New Form2 ou Dim frm_filho As New Form3

Em seguida definimos qual o formulário pai e exibimos o formulário filho:

frm_filho.MdiParent = Me
frm_filho.Show()

Feito isso já podemos iniciar com o Microsoft Access...

Acessando e navegando no Microsoft Access

Se você não sabe o Microsoft Access é um banco de dados relacional de pequeno porte que pode ser usado em aplicações pequenas e protótipos. Um banco de dados Microsoft Access é um arquivo com extensão .mdb que contém as tabelas, consultas, procedimentos armazenados, view, etc.

Para este exemplo eu criei um banco de dados chamado Cadastro.mdb que contém a tabela Clientes com a estrutura já descrita acima:

 Para podemos trabalhar com o banco de dados Access devemos usar o provedor OleDb que esta presente no VB 2008 Express.

Como vamos fazer o acesso usando ADO .NET via código vamos usar também os seguintes objetos ADO .NET:

Vamos definir então o leiaute do formulário form1.vb que já foi criado conforme a figura abaixo:

Após isso abra o formulário na visão de código e inclua no início do arquivo as declarações:

Imports System.Data
Imports System.Data.OleDb

Com isso asseguramos o acesso as classes ADO .NET para acessar e gerenciar os dados no Microsoft Access;

A primeira coisa que temos que nos preocupar é em realizar a conexão com o banco de dados e para isso temos que definir a string de conexão para o provedor OleDb.

Como o arquivo Cadastro.mdb esta localizado na pasta c:\dados a string de conexão para o exemplo ficará assim :

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\dados\Cadastro.mdb"

Como você já deve ter desconfiado , o objeto Connection têm a função de gerar uma conexão com uma fonte de dados sendo portanto o objeto fundamental no acesso a dados.
 

Para estabelecer uma conexão com uma fonte de dados o objeto Connection usa a propriedade ConnectionString que é a string de conexão que deverá ser informada para que a conexão seja efetivamente aberta.
 

Vamos definir então as variáveis ADO .NET que vamos usar no projeto fazendo as seguintes declarações logo após o início do formulário:
 

Dim conn As OleDbConnection
Dim ds As DataSet
Dim da As OleDbDataAdapter
Dim i As Integer = 0


Vencida esta etapa vamos definir a conexão com o banco de dados Cadastro.mdb no evento Load do formulário form1.vb da seguinte forma:
 

 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        conn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\dados\Cadastro.mdb")
        conn.Open()
        da = New OleDbDataAdapter("select * from Clientes", conn)
        ds = New DataSet()
        da.Fill(ds, "clientes")
        gdvClientes.DataSource = ds.Tables("clientes")
        Call ExibeDados()
    End Sub

Neste código temos o procedimento padrão para realizar uma conexão com um banco de dados:

A rotina ExibeDados() exibe os valores dos campos da tabela clientes nos controles TextBox do formulário conforme o código abaixo:
 

 Private Sub ExibeDados()
        TextBox1.Text = ds.Tables(0).Rows(i)("ID").ToString()
        TextBox2.Text = ds.Tables(0).Rows(i)("nome").ToString()
        TextBox3.Text = ds.Tables(0).Rows(i)("email").ToString()
        TextBox4.Text = ds.Tables(0).Rows(i)("cidade").ToString()
        TextBox5.Text = ds.Tables(0).Rows(i)("idade").ToString()
    End Sub


Como estamos trabalhando com dataset não tipado temos no código a definição da tabela do dataset que foi preenchida, no caso a tabela de índice zero e a linha (Rows) com o índice respectivo seguido do nome do campo da tabela, convertido para o formato string :
ds.Tables(0).Rows(i)("ID").ToString()


Poderíamos ter usado no lugar do nome do campo o índice respectivo , neste caso teríamos o código da seguinte forma:
 

 Private Sub ExibeDados()
        TextBox1.Text = ds.Tables(0).Rows(i)(0).ToString()
        TextBox2.Text = ds.Tables(0).Rows(i)(1).ToString()
        TextBox3.Text = ds.Tables(0).Rows(i)(2).ToString()
        TextBox4.Text = ds.Tables(0).Rows(i)(3).ToString()
        TextBox5.Text = ds.Tables(0).Rows(i)(4).ToString()
    End Sub

 

Definindo o código do botão Primeiro

 

O código que permite navegar para o primeiro registro da tabela, colocado no evento Click do botão btnPrimeiro é dado abaixo:

 

 Private Sub btnPrimeiro_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrimeiro.Click
        If ds.Tables(0).Rows.Count > 0 Then
            i = 0
           Call ExibeDados()
        End If
    End Sub

 

Neste código ds.Tables(0).Rows.Count retorna a quantidade de registros na tabela Clientes.

 

Verificamos primeiro se existem registros a serem exibidos : if ds.Tables(0).Rows.Count > 0

 

Neste caso definimos o índice i igual a zero (i=0) indicando que vamos exibir a primeira linha da tabela e para isso chamamos a rotina ExibeDados().

 

Definindo o código do botão Próximo

 

O código que permite navegar para o próximo registro da tabela, colocado no evento Click do botão btnProximo é dado abaixo:

 

Private Sub btnProximo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProximo.Click
        If i < ds.Tables(0).Rows.Count - 1 Then
            i += 1
            Call ExibeDados()
        End If
    End Sub

 

Neste código verificamos se a quantidade de registros da tabela menos 1 é menor que índice atual (i) (fazemos isso pois a quantidade de linhas na tabela inicia no índice zero, e, se houver 4 linhas a última linha terá o índice 3 e não 4) é menor que o índice atual (i) e neste caso incrementamos (i+=1 o mesmo que i=i+1) o índice.

 

Definindo o código do botão Anterior

 

O código que permite navegar para o registro anterior da tabela, colocado no evento Click do botão btnAnterior é dado abaixo:

 

    Private Sub btnAnterior_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAnterior.Click
        If i = ds.Tables(0).Rows.Count - 1 OrElse i <> 0 Then
            i -= 1
            Call ExibeDados()
        Else
            MsgBox("Início de arquivo.")
        End If
    End Sub

 

Neste código verificamos se a quantidade de registros da tabela menos 1 é igual ao índice atual (i) ou se o índice é diferente de zero (i<>0) para decrementarmos o índice (i-=1 o mesmo que i=i-1)

 

Definindo o código do botão Último

 

O código que permite navegar para o último registro da tabela, colocado no evento Click do botão btnUltimo é dado abaixo:

 

Private Sub btnUltimo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUltimo.Click
        If ds.Tables(0).Rows.Count > 0 Then
            i = ds.Tables(0).Rows.Count - 1
            Call ExibeDados()
        End If
    End Sub

 

Neste código verificamos se existem registros a serem exibidos e atribuímos a quantidade total de registros menos 1 (lembre-se que o índice inicia em zero) ao índice.

 

Executando o projeto e selecionado a opção para o banco de dados Microsoft Access teremos:

 

Acessando e navegando no SQL Server

O SQL Server é um banco de dados relacional robusto e indicado para aplicações de médio e grande porte. Sua relação custo benefício é muito boa e ele é muito fácil de administrar e gerenciar.

Para trabalhar com o SQL Server podemos usar as versões Express que são gratuitas mas que possuem limitação de tamanho. A ferramenta usada para trabalhar com o SQL Server é o SQL Server Management Studio que também possui uma versão Express.

Para o exemplo deste artigo eu criei um banco de dados chamado cadastro.mdf e a tabela Clientes com estrutura indica no início do artigo usando o SQL Server 2005 Management Studio Express Edition:

Para podemos trabalhar com o banco de dados SQL Server devemos usar o provedor SqlClient que esta presente no VB 2008 Express.

O tratamento a ser feito para acessar e navegar pelos registros da tabela Clientes do banco de dados SQL Server é quase igual ao do Microsoft Access.

O formulário form2.vb é idêntico ao formulário form1.vb e o código para os eventos dos Botões é o mesmo a diferença fica por conta do acesso a dados.

No início do formulário form2.vb devemos declarar os namespaces para termos acesso as classes que acessam os objetos ADO .NET:

Imports System.Data
Imports System.Data.SqlClient

A conexão com o banco de dados usa a string de conexão com o provedor SqlCLient da seguinte forma:

"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\dados\Cadastro.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"

Obs: Eu estou usando um banco de dados SQL Server anexado que esta na pasta c:\dados.

 

Vamos definir então as variáveis ADO .NET que vamos usar no projeto fazendo as seguintes declarações logo após o início do formulário:

 

Dim conn As SqlConnection
Dim ds As DataSet
Dim i As Integer = 0
Dim da As SqlDataAdapter

No evento Load do formulário vamos definir o código que realiza a conexão com o banco de dados SQL Server:

 

 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        conn = New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=C:\dados\Cadastro.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True")
        conn.Open()
        da = New SqlDataAdapter("select * from Clientes", conn)
        ds = New DataSet()
        da.Fill(ds, "clientes")
        gdvClientes.DataSource = ds.Tables("clientes")
        Call ExibeDados()
    End Sub

 

O código é igual ao usado para o Microsoft Access o que muda são os objetos relacionados ao provedor para o SQL Server.

 

Acessando e navegando no MySQL

O MySQL é um banco de dados relacional robusto e indicado para aplicações de médio e grande porte sendo uma outra opção ao SQL Server com o diferencial de ter um custo bem menor.

 

Para trabalhar com o MySQL podemos baixar a versão Community Server que é gratuita. Para gerenciar o banco de dados usamos o MySQL Administrator e o MySQL Query Browser.

 

Para o exemplo deste artigo eu criei um banco de dados chamado cadastro e a tabela Clientes com estrutura indica no início do artigo usando o MySQL Administrator:

 


Além disso temos que instalar o MySQL
Connector/NET que é o driver ADO .NET para o MySQL. O resto é tudo igual.

 

No início do formulário form3.vb devemos declarar os namespaces para termos acesso as classes que acessam os objetos ADO .NET:

Imports System.Data
Imports MySql.Data.MySqlClient

 

As variáveis ADO .NET que vamos usar no projeto fazendo as seguintes declarações logo após o início do formulário é dada a seguir:

 

Dim conn As MySqlConnection
Dim ds As DataSet
Dim i As Integer = 0
Dim da As MySqlDataAdapter

A conexão com o banco de dados usa a string de conexão com o provedor MySql da seguinte forma:

 

 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        conn = New MySqlConnection("server=localhost;user id=root;password=gpxpst;database=Cadastro")
        conn.Open()
        da = New MySqlDataAdapter("select * from Clientes", conn)
        ds = New DataSet()
        da.Fill(ds, "clientes")
        gdvClientes.DataSource = ds.Tables("clientes")
        Call ExibeDados()
    End Sub

 

O código é igual ao usado para o Microsoft Access e para o SQL Server o que muda são os objetos relacionados ao provedor para o MySQL.

 

Na figura abaixo vemos o projeto em execução exibindo os três formulários que acessam banco de dados diferentes usando a mesma interface e o mesmo tratamento para a navegação dos registros o que muda é parte intrínseca a conexão com cada banco de dados.

 

 

Neste exemplo eu criei um formulário , que será idêntico ao formulário form1, para cada exemplo de banco de dados usado : SQL Server e MySQL.

Não precisaria ter feito isso, eu poderia ter usado um único formulário e ter feito o tratamento no evento Load do formulário para cada banco de dados.

Para fazer isso eu preciso passar um parâmetro para o formulário que para este exemplo será o formulário form4.vb.

Para passar este parâmetro eu vou usar o construtor do formulário da seguinte forma:

- Incluo um novo formulário no projeto (form4.vb) e copio os controles do formulário form1.vb;

- A seguir tenho que definir uma enumeração que irá me permitir distinguir qual banco de dados eu vou tratar:

Enum BancoDados
    Access = 1
    SqlServer = 2
     MySql = 3
End Enum

- A seguir declaro uma variável do tipo da minha enumeração;

Dim valorEnum As BancoDados

- Agora eu defino o construtor do formulário form4.vb da seguinte forma:

Sub New(ByVal bd As Integer)
        ' This call is required by the Windows Form Designer.
        InitializeComponent()

        valorEnum = CType(bd, BancoDados)
    End Sub

- Finalmente no evento Load do formulário eu verifico valor que foi passado no construtor do formulário e chamo a respectiva rotina para acessar o banco de dados selecionado:

Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Select Case valorEnum
            Case BancoDados.Access
                acesso_MicrosoftAccess()
            Case BancoDados.SqlServer
                acesso_SQLServer()
            Case BancoDados.MySql
                acesso_MySql()
            Case Else
                Exit Select
        End Select
    End Sub

As rotinas de acesso a dados são as mesmas usadas nos formulários form1.vb, form2.vb e form3.vb:

 Private Sub acesso_MicrosoftAccess()
        Dim conn As OleDbConnection
        Dim da As OleDbDataAdapter

        conn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\dados\Cadastro.mdb")
        conn.Open()
        da = New OleDbDataAdapter("select * from Clientes", conn)
        ds = New DataSet()
        da.Fill(ds, "clientes")
        gdvClientes.DataSource = ds.Tables("clientes")
        Call ExibeDados()
    End Sub

    Private Sub acesso_SQLServer()
        Dim conn As SqlConnection
        Dim da As SqlDataAdapter

        conn = New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=C:\dados\Cadastro.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True")
        conn.Open()
        da = New SqlDataAdapter("select * from Clientes", conn)
        ds = New DataSet()
        da.Fill(ds, "clientes")
        gdvClientes.DataSource = ds.Tables("clientes")
        Call ExibeDados()
    End Sub

    Private Sub acesso_MySql()
        Dim conn As MySqlConnection
        Dim da As MySqlDataAdapter

        conn = New MySqlConnection("server=localhost;user id=root;password=gpxpst;database=Cadastro")
        conn.Open()
        da = New MySqlDataAdapter("select * from Clientes", conn)
        ds = New DataSet()
        da.Fill(ds, "clientes")
        gdvClientes.DataSource = ds.Tables("clientes")
        Call ExibeDados()
    End Sub

Lembre-se de declarar os namespaces que serão usados para cada banco de dados no formulário form4.vb:

Imports System.Data
Imports System.Data.OleDb
Imports System.Data.SqlClient
Imports MySql.Data.MySqlClient

Agora basta alterar a chamada no formulário frmMenu que é o formulário pai da seguinte forma:

 Private Sub mnuItemAccess_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuItemAccess.Click
        Dim frm_filho As New Form4(1)
        If IsNothing(frm_filho) = True Then
            MsgBox("O formulário já esta sendo exibido !", MsgBoxStyle.Exclamation)
        Else
            frm_filho.MdiParent = Me
            frm_filho.Show()
        End If
    End Sub
    Private Sub mnuItemSqlServer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuItemSqlServer.Click
        'Declaração da variável frmSqlServer (nome do form que vai ser chamado)
        Dim frm_filho As New Form4(2)
        frm_filho.MdiParent = Me 'Permite que o Form Filho seja aberto dentro do Form MDI
        frm_filho.Show()              'Chama o Form frmSqlServer
    End Sub

    Private Sub mnuItemMySQL_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuItemMySQL.Click
        'Declaração da variável frmSqlServer (nome do form que vai ser chamado)
        Dim frm_filho As New Form4(3)
        frm_filho.MdiParent = Me 
        frm_filho.Show()        
    End Sub

Observe que ao criar a instância do formulário filho eu estou passando o valor inteiro 1,2 ou 3 conforme a opção que desejo acessar.

O resultado final é o mesmo...

Como este artigo é voltado para iniciantes eu preferi usar o código de acesso a dados no formulário do projeto mas as boas práticas recomendam a criação de uma camada de acesso a dados que pode ser feita de diversas formas.

Se você notar este exemplo duplica muito código e em uma aplicação mais complexa seria difícil manter e testar por isso é um exemplo que tem objetivo de mostrar alguns recursos da linguagem VB .NET mas o método usado não deve ser o adotado em uma aplicação de acesso a dados de produção.

Pegue o projeto completo aqui: NavegacaoNet.zip

Eu sei é apenas .NET, mas eu gosto...

Referência:


José Carlos Macoratti