VB.NET - Criando Procedimentos Armazenados no MsAccess
Em diversos artigos já publicados eu tratei do assunto procedimentos armazenados, veja relação abaixo. Creio que a maioria tratou do assunto relacionado com o SQL Server , devido as limitações do banco de dados Microsoft Access.
Acontece que nas novas versões do Access a Microsoft realizou um grande esforço para superar algumas destas limitações e trazer o produto MsAccess mais perto de um verdadeiro banco de dados relacional.. Uma boa notícia é que as Stored Procedures podem ser usadas no Access , mais precisamente a partir versão do Jet Engine 4.0. (No Access97 você já podia trabalhar com consultas armazenadas)
Como os procedimentos armazenados (Stored Procedures) funcionam no Access
Os procedimentos armazenados não possuem uma interface com o usuário e não podem ser criados usando uma interface. (nada é perfeito...)
A única forma , pelo menos até a versão que conheço que é a 2002, é via código. Isto mesmo você tem que codificar para poder usar e trabalhar com eles no Access.
Quando um procedimento armazenado é incluído no Access o Jet Engine 'compila' o procedimento armazenado em um objeto de consulta. A vantagem é que isto fica transparente para o desenvolvedor de modo que você pode abstrair a camada de dados tornando a sua aplicação mais escalável , ou seja, você pode migrar para outro banco de dados mais facilmente sem ter que alterar todo o seu código.
Criando Procedimentos Armazenados
Vamos então criar nosso primeiro procedimento armazenado no Access. Eu vou usar o banco de dados Northwind.mdb que vem com o Access, assim todos podem acompanhar , e eu não tenho que enviar o banco de dados. OK !. Vou trabalhar com a tabela Products pois não é uma tabela com muitos registros nem muitos campos. Só para lembrar a estrutura desta tabela é dada abaixo:
Vou usar também a tabela Categories no exemplo da inclusão de registros. A estrutura desta tabela é a seguinte :
Nosso primeiro procedimento armazenado irá selecionar todos os registros da tabela Products. A sintaxe é a seguinte :
"CREATE PROC spListaProdutos AS SELECT * FROM Products"
Este código cria o procedimento armazenado - spListaProdutos. (Obs: sp são as iniciais de stored procedures)
parte do código que cria efetivamente o procedimento armazenado é : CREATE PROC spListaProdutos
a parte que segue a palavra chave AS refere a consulta Seleção SQL : SELECT * FROM Products
Se você deseja poder passar um valor para ser usado pela consulta SQL pode fazer isto sem problema. Vamos supor que você queira deletar uma linha da tabela Products que tenha um determinado código de Produto (ProductID). Veja abaixo como ficaria este procedimento:
"CREATE PROC spDeletaProduto(CodigoProduto LONG) AS DELETE FROM Products WHERE ProductID = CodigoProduto;"
perceba que após a utilização do comando para criar o procedimento armazenado foram usados parênteses para definir o parâmetro CodigoProduto como sendo do tipo LONG. Esta variável é que será usada para informar o valor do código do produto que você quer excluir.
Vamos ver agora como criar um procedimento armazenado para inclusão de dados na tabela Categories.
"CREATE PROC
spIncluiCategoria(nomeCategoria VARCHAR(15),descricao TEXT, foto IMAGE) " & _
"INSERT INTO Categories(CategoryName,Description,Picture) " & _
"VALUES(nomeCategoria,descricao,foto)"
Se fosse fazer para a tabela Products teria o seguinte resultado:
"CREATE PROC spIncluiProduto(nomeProduto VARCHAR(40), codFornecedor LONG, codCategoria LONG, quantidade VARCHAR(20), " & _
"precoUnitario MONEY, uniEstoque LONG, uniPedido LONG, nivelUnidade LONG, continuado byte) " & _
"AS INSERT INTO Products (ProductName, SupplerID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued) " & _
"VALUES (nomeProduto, codFornecedor, codCategoria, quantidade, precoUnitario, uniEstoque, uniPedido, nivelUnidade, continuado)"
Agora um exemplo para atualizar a tabela:
"CREATE PROC spAutalizaProdutos(codigoProduto
LONG, nomeProduto VARCHAR(40)) AS UPDATE Products SET ProductName = " & _
"nomeProduto WHERE ProductID = codigoProduto;"
Para encerrar esta primeira parte cabe dizer que existem algumas limitações :
- Parâmetros de saída ainda não são permitidos
(pelo menos até a versão 2002)
- Tabelas temporárias não são disponíveis
- A sintaxe Transact SQL usada no SQL Server não é totalmente compatível
, portanto , cuidado com o copiar e colar.
Bem , agora vamos mostrar o código VB.NET que irá criar todas estes procedimentos no banco de dados Northwind.
Crie um novo projeto no VS.NET do tipo Console Application e inclua o Módulo CriaSP() conforme o código abaixo:
Imports System
Imports System.Data
Imports System.Data.OleDb
Module criaSP
Sub Main()
ProcedimentosArmazenadosProdutos()
End Sub
' Procedimentos Armazenados a serem incluidos no banco de dados
Sub ProcedimentosArmazenadosProdutos() Dim strSQL As String ' spListaProdutos - retorna todos os registros da tabela produtos strSQL = "CREATE PROC spListaProdutos AS SELECT * FROM Products;" criaProcedimentoArmazeando(strSQL) ' spDeletaProduto - Efetua a exclusão de uma linha da tabela Products com base ' em um código de produto informado como parãmetro strSQL = "CREATE PROC spDeletaProduto(codigoProduto LONG) " & _ "AS DELETE FROM Products WHERE ProductID = codigoProduto;" criaProcedimentoArmazeando(strSQL) 'spIncluiProduto - Inclua uma linha na tabela Products strSQL = "CREATE PROC spIncluiProduto(nomeProduto VARCHAR(40), codFornecedor LONG, codCategoria LONG, quantidade VARCHAR(20), " & _ "precoUnitario MONEY, uniEstoque LONG, uniPedido LONG, nivelUnidade LONG, continuado byte) " & _ "AS INSERT INTO Products (ProductName, SupplerID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued) " & _ "VALUES (nomeProduto, codFornecedor, codCategoria, quantidade, precoUnitario, uniEstoque, uniPedido, nivelUnidade, continuado)" criaProcedimentoArmazeando(strSQL) ' spAtualizaProdutos - atualiza itens da tabela Products strSQL = "CREATE PROC spAtualizaProdutos(codigoProduto LONG, nomeProduto VARCHAR(40)) " & _ "AS UPDATE Products SET ProductName = nomeProduto WHERE ProductID = codigoProduto;" criaProcedimentoArmazeando(strSQL) End Sub ' Executa a criação dos procedimentos armazenados Sub criaProcedimentoArmazeando(ByVal strSQL As String) Dim con As OleDbConnection Dim cmd As OleDbCommand = New OleDbCommand Dim da As OleDbDataAdapter ' Verifique se a localização do banco de dados é mesma no seu ambiente Dim sConStr As String = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=d:\teste\Northwind.mdb" con = New OleDbConnection(sConStr) cmd.Connection = con cmd.CommandText = strSQL Try con.Open() cmd.ExecuteNonQuery() Catch ex As Exception MsgBox(ex.Message) Finally con.Close() End Try End Sub End Module
|
No código acima temos duas rotinas básicas:
1 - ProcedimentosArmazenadosProdutos() - que constrói e monta cada um dos procedimentos armazenados
2- criaProcedimentoArmazeando(strSQL) - que efetua a conexão com o banco de dados e excuta o comando para criar o procedimento armazenado no banco de dados Northwind.mdb
Após executar o código acima se você abrir o banco de dados Northwind.mdb e ir na guia Consultas irá ver os procedimentos armazenados ali criados:
Agora com um recurso tão poderoso a sua
disposição você deve começar a pensar a usá-lo em suas aplicações com acesso a
dados.
O código completo você pega aqui : spAccess.zip
Veja a continuação deste artigo que mostra como usar os procedimentos em :
VB.NET - Usando Procedimentos Armazenados no MsAccess I
Até breve ...
Veja os Destaques e novidades do SUPER DVD VB (sempre atualizado) : clique e confira ! Quer migrar para o VB .NET ? Veja mais sistemas completos para a plataforma .NET no Super DVD .NET , confira... Quer aprender C# ??
Chegou o
Super DVD C# com exclusivo material de
suporte e vídeo aulas com curso básico sobre C# |
Gostou ? Compartilhe no Facebook Compartilhe no Twitter
Referências: