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:
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 |
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:
da = New OleDbDataAdapter("select * from Clientes", conn)
ds = New DataSet()
da.Fill(ds, "clientes")
gdvClientes.DataSource = ds.Tables("clientes")
Call ExibeDados()
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: