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