1. 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.
2. -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.
3. 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 :
RS e RS1 do tipo ADODB.Recordset
da - OleDbDataAdapter
ds - DataSet
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 :
carregaDados() - preenche as caixas de texto com os dados do recordset
RS1
carregaGrid() - preenche o DataGrid com os dados do recordset RS
4. 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:
5. 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
6. 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
7. 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
8. '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:
9. 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