VB.NET - Usando ADO para acesso e manutenção de dados


Lembra da ADO (ActiveX Data Object) ? Você sabia que podemos usar ADO normalmente em nossos projetos VB.NET para acessar e gerenciar dados ?

Se você sente saudades ou pretende usar os recursos que a ADO oferecia para navegação pelos registros e atualização dos mesmos em seus projetos VB.NET, sinta-se a vontade pois neste artigo eu vou mostrar como podemos usar ADO para acessar , selecionar , alterar, incluir , excluir e navegar pelos registros de uma tabela de um banco de dados Access.

ADO.NET não possui recursos de movimentação pelos registros nem suporta cursores. Os recursos de navegação pelos registros tais como MoveFirst , MoveNext , etc. não são suportados. Com ADO podemos usar estes recursos sem problemas usando o objeto Recordset em um projeto VB.NET para acesso a dados.

A minha intenção é mostrar que é possível usar ADO com o VB.NET mas sinceramente eu não encorajo esta prática pois a nova tecnologia ADO.NET oferece mais recursos.

Criando o projeto no VB.NET

O objetivo do projeto é acessar a tabela Produtos do banco de dados ITEM.mdb . A estrutura da tabela é a seguinte :

Vamos criar um projeto VB.NET do tipo Windows Application dando o nome a ele de ITEM. O projeto irá possuir somente um formulário - form1.vb. Neste formulário vamos incluir alguns controles : TextBox , Button , Label e um controle DataGrid ; conforme figura abaixo.

Nota: Eu estou usando o Visual Studio .NET 2003 e o Framework 1.1. 

-Os botões : Primeiro , Próximo, Anterior e Último irão fazer a navegação pelos registros

- Os botões : Novo , Salvar , Edita , Excluir irão efetuar operações de manutenção de dados

- O botão - Procurar - irá localizar dados na fonte de informações

Neste projeto iremos utilizar dois recordsets RS e RS1 .

O recordset RS1 será usado para exibir os dados nas caixas de texto. É ele que irá ser acionado para incluir, alterar, excluir e navegar pelos registros

O recordset RS será usado para exibir os dados no DataGrid.

Estarei preenchendo o DataGrid via objeto DataAdatper e DataSet.

Para pode utilizar os objetos ADO devemos incluir uma referência em nosso projeto para a biblioteca ADODB.Fazemos isto clicando com o botão direito do mouse sobre o nome do projeto e selecionando a opção Add Reference. A seguir na janela Add reference , na guia NET , selecione adodb e clique no botão OK. Na figura abaixo temos a seleção da biblioteca e o resultado final com a biblioteca referenciada no projeto.

Feito isto já podemos criar nosso código usando ADO no projeto. Vamos lá. (Eu não vou repetir as explicações referente ao código ADO pois já foi exaustivamente discutido em diversos artigos)

O código do projeto

Primeiro vou declarar o namespace System.Data.OleDB e definir as variáveis :

A primeira linha do projeto seria então um import no namespace System.Data:

Imports System.Data.OleDb

A seguir já no formulário teríamos as declarações das variáveis:

Dim CN As New ADODB.Connection
Dim RS, RS1 As New ADODB.Recordset
Dim da As New OleDbDataAdapter
Dim ds As New DataSet

No evento Load do formulário  teremos a criação da conexão com o banco de dados e o chamamento das rotinas :

 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        CN = New ADODB.Connection     'conexao usando ADO
        CN.Open("Provider = MICROSOFT.JET.OLEDB.4.0;data Source=ITEM.MDB ")
        Call carregaDados() 'exibe informação do recordset nas caixas de texto
        Call CarregaGrid() 'exibe informação da tabela no grid
    End Sub

 

A rotina carregaDados tem o seguinte código : O código cria um novo objeto Recordset do tipo ADO e seleciona todos os registros da tabela Produtos usando a instrução SQL : select * from Produtos order by Codigo.

A seguir invocamos a rotina exibeTexto(). Esta rotina apenas preenche os TextBox do formulário atribuindo os dados do recordset a cada TextBox.

Private Sub carregaDados()
        'quando o formulario é carregado os dados são exibidos no textbox
        RS1 = New ADODB.Recordset
        RS1.Open("select * from Produtos order by Codigo", CN, 1, 2)
        Call exibeTexto()
End Sub

A rotina carregaGrid() cria o recordset RS da mesma forma que a rotina carregaDados e cria também um objeto DataAdapter e um objeto DataSet para preencher o DataSet com os dados da tabela Produtos e exibição no  DataGrid.

Private Sub CarregaGrid()
        'exibe informação da tabela no grid
        RS = New ADODB.Recordset
        RS.Open("select * from Produtos order by Codigo", CN, 1, 2)
        da = New OleDbDataAdapter
        ds = New DataSet
        da.Fill(ds, RS, "Produtos")
        DataGrid1.DataSource = ds.Tables("Produtos")
        DataGrid1.Refresh()
    End Sub

 

A rotina exibeTexto() é muito simples , seu código é dado a seguir. Esta rotina será chamada sempre que eu desejar exibir os dados nas caixas de texto.

Private Sub exibeTexto()
        Codigo.Text = RS1.Fields("Codigo").Value
        Nome.Text = RS1.Fields("Nome").Value
        Quantidade.Text = RS1.Fields("Quantidade").Value
        Preco.Text = RS1.Fields("Preco").Value
        Total.Text = RS1.Fields("total").Value
End Sub

Vamos agora mostrar o código dos botões que efetuam manutenção nos dados:

1- Código do botão Novo. Este código limpa as caixas de texto , chama a rotina HabilitaTextBox() , põe o foco na caixa Codigo e habilita o botão Salvar desabilitando os demais.

'botao NOVO
    Private Sub ButADD_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButADD.Click
        Codigo.Text = ""
        Nome.Text = ""
        Quantidade.Text = ""
        Preco.Text = ""
        Total.Text = ""
        Call HabilitaTextBox()
        Codigo.Focus()
        ButSAVE.Enabled = True
        ButADD.Enabled = False
        ButEDIT.Enabled = False
        ButDELETE.Enabled = False
        MoveFirst.Enabled = False
        MovePrevious.Enabled = False
        MoveNext.Enabled = False
        MoveLast.Enabled = False
    End Sub

2- O Botão Salvar pode possuir dois valores : Salvar e Atualizar. Conforme a opção indicada no botão teremos uma ação a ser realizada: incluir novo registro ou atualizar o registro. Note que estou chamando as rotinas carregaDados e carregaGrid apos as operações para atualizar a exibição dos dados.

'botao salvar
    Private Sub ButSAVE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButSAVE.Click
        If Codigo.Text = "" Or Nome.Text = "" Or Quantidade.Text = "" Or Preco.Text = "" 
Then MsgBox("Informe o nome do produto.", MsgBoxStyle.Critical) : Exit Sub
        If ButSAVE.Text = "Salvar" Then
            RS1 = New ADODB.Recordset
            RS1.Open("select * from Produtos ", CN, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic)
            ' se incluir um novo registro
            RS1.AddNew()
            RS1.Fields("Codigo").Value() = Codigo.Text
            RS1.Fields("Nome").Value = Nome.Text
            RS1.Fields("Quantidade").Value = Quantidade.Text
            RS1.Fields("Preco").Value = Preco.Text
            RS1.Fields("total").Value = Total.Text
            RS1.Update()
            Call carregaDados()
            Call CarregaGrid()
            MsgBox("Seus dados foram incluídos com sucesso", MsgBoxStyle.Information, "Dados gravados")
            ButEDIT.Enabled = True
            ButADD.Enabled = True
            ButDELETE.Enabled = True
            ButSAVE.Enabled = False
            MoveFirst.Enabled = True
            MovePrevious.Enabled = True
            MoveNext.Enabled = True
            MoveLast.Enabled = True
        End If
        'se quiser Atualiza o arquivo
        If ButSAVE.Text = "Atualiza" Then
            RS1 = New ADODB.Recordset
            RS1.Open("select * from Produtos where codigo=" & CInt(Codigo.Text), CN, ADODB.CursorTypeEnum.adOpenStatic, 
ADODB.LockTypeEnum.adLockOptimistic)
            RS1.Fields("Codigo").Value() = Codigo.Text
            RS1.Fields("Nome").Value = Nome.Text
            RS1.Fields("Quantidade").Value = Quantidade.Text
            RS1.Fields("Preco").Value = Preco.Text
            RS1.Fields("total").Value = Total.Text
            RS1.Update()
            Call carregaDados()
            Call CarregaGrid()
            MsgBox("Registros atualizados com sucesso", MsgBoxStyle.Information, "Atualiza")
            ButADD.Enabled = True
            ButSAVE.Text = "Salvar"
            ButSAVE.Enabled = False
            ButEDIT.Enabled = True
            ButDELETE.Enabled = True
            MoveFirst.Enabled = True
            MovePrevious.Enabled = True
            MoveNext.Enabled = True
            MoveLast.Enabled = True
        End If
    End Sub

3- O botão Editar apenas altera o nome do botão para Atualizar e desabilita os demais botões.

'bota editar
    Private Sub ButEDIT_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButEDIT.Click
        Call HabilitaTextBox()
        ButEDIT.Enabled = False
        ButADD.Enabled = False
        ButDELETE.Enabled = False
        ButSAVE.Enabled = True
        ButSAVE.Text = "Atualiza"
        MoveFirst.Enabled = False
        MovePrevious.Enabled = False
        MoveNext.Enabled = False
        MoveLast.Enabled = False
End Sub

4- O botão Excluir exclui o registro selecionado e atualiza a exibição.

'botão excluir
    Private Sub ButDELETE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButDELETE.Click
        Dim resposta As String
        resposta = MsgBox("Confirma exclusão deste produto   '" & Nome.Text & "' ?", 
MsgBoxStyle.Question + MsgBoxStyle.YesNo, "Excluir")
        If resposta = vbNo Then Exit Sub
        RS1 = New ADODB.Recordset
        RS1.Open("DELETE  from Produtos where Nome = '" & Nome.Text & "'", CN, 1, 2)
        MsgBox("'" & Nome.Text & "'  Produto Excluido ", MsgBoxStyle.Information, "Excluido")
        Call CarregaGrid()
        Call carregaDados()
    End Sub

 

O botão Procurar realiza uma busca na tabela e gera um recordset conforme o critério :

"SELECT * FROM Produtos WHERE Nome LIKE '" & Txtbusca.Text & "%' "

onde txtbusca.text é critério de busca informado na caixa de texto para o nome do produto.

 'Procurar
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If Button1.Text = "Procurar" Then
            If Txtsearch.Text = "" Then MsgBox("Informe o nome do Produto", MsgBoxStyle.Critical, "Nome do Produto")
 : Exit Sub
            da = New OleDbDataAdapter
            ds = New DataSet
            RS1 = New ADODB.Recordset
            RS1.Open("SELECT * FROM Produtos WHERE Nome LIKE '" & Txtsearch.Text & "%' ", 
CN, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic)
            RS1.MoveFirst()
            Call exibeTexto()
            da.Fill(ds, RS1, "ITEM")
            DataGrid1.DataSource = ds.Tables(0)
            Button1.Text = "Todos"
        Else
            Button1.Text = "Procurar"
            Call CarregaGrid()
            Call carregaDados()
        End If
    End Sub

 

As rotinas de navegação pelos registros são mostradas abaixo:

 'primeiro
    Private Sub MoveFirst_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MoveFirst.Click
        On Error Resume Next
        RS1.MoveFirst()
        Call exibeTexto()
    End Sub
    
    'proximo
    Private Sub MoveNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MoveNext.Click
        On Error Resume Next
        If RS1.EOF = True Then MsgBox("Este é o último registro", MsgBoxStyle.Information, "Último") : Exit Sub
        RS1.MoveNext()
        If RS1.EOF = True Then MsgBox("Último registro", MsgBoxStyle.Information, "Fim") : Exit Sub
        Call exibeTexto()
    End Sub

    'anterior
    Private Sub MovePrevious_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MovePrevious.Click
        On Error Resume Next
        If RS1.BOF = True Then MsgBox("Primeiro registro", MsgBoxStyle.Information, "Primeiro") : Exit Sub
        RS1.MovePrevious()
        If RS1.BOF = True Then MsgBox("Primeiro registro", MsgBoxStyle.Information, "Primeiro") : Exit Sub
        Call exibeTexto()
    End Sub
    'ultimo
    Private Sub MoveLast_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MoveLast.Click
        On Error Resume Next
        RS1.MoveLast()
        Call exibeTexto()
    End Sub

Nos eventos Changed e KeyPress das caixas de texto para Preço e Quantidade coloquei um código para recálculo do valor total conforme código abaixo:

'Se alterar o preço recalcula o total
    Private Sub Preco_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Preco.TextChanged
        Total.Text = Val(Quantidade.Text) * Val(Preco.Text)
    End Sub

    'se alterar a quantidade então recalcula o total
    Private Sub Quantidade_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Quantidade.TextChanged
        Total.Text = Val(Quantidade.Text) * Val(Preco.Text)
    End Sub

    Private Sub Total_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Total.KeyPress
        Total.Text = Val(Quantidade.Text) * Val(Preco.Text)
    End Sub

Executando o projeto teremos o seguinte resultado:

Eu não me preocupei muito com validação de dados nem com tratamento de erros. Meu objetivo era apenas criar um projeto VB.NET funcional usando ADO para acesso e manutenção dos dados. Espero que gostem...

Pegue o projeto completo aqui : produtos.zip

Simples , rápido e fácil : VB.NET ...


José Carlos Macoratti