VB - Criando uma classe de acesso a dados com ADO
Neste artigo vou criar uma classe para acesso a dados. O objetivo é mostrar como é fácil criar classes no VB e como isto pode tornar o seu projeto mais versátil. |
Não é primeiro artigo sobre classes no VB , e portanto eu não vou repetir aqui os conceitos básicos já abordados nos artigos anteriores. Para recordar ou saber mais sobre o assunto leia os artigos do site:
Criando classes no Visual Basic
VB5/VB6 - Pondo em prática a
Programação orientada a objetos
Meu primeiro projeto orientado a objetos
: Cadastro de Clientes
Banco
de dados - Programando com classe
VB - Criando Classes para gerenciar dados
Antes de criar a classe
precisamos projetar qual o objetivo da classe , quais as
propriedades e métodos que vamos precisar expor para que a
classe tenha a sua funcionalidade otimizada. Sentar na frente no
micro , abrir o VB e ir digitando o código pode te levar a
perder muito tempo , o melhor e sentar e planejar com cuidado um
esboço do projeto : objetivo , escopo , funcionalidades ,
implementação , etc.
No nosso caso particular temos que pensar no que precisamos para criar uma classe de acesso a dados que realmente funcione. Podemos começar fazendo perguntas :
Nossa classe será tanto mais complexa quanto mais genérica forem suas funcionalidades.
Neste artigo , por questão de tempo e simplicidade , nossa classe terá as seguintes características :
Fonte de dados e modo de acesso:
- Acesso a banco de dados
Access e SQL Server usando ADO
Métodos :
- conecta_bd - realiza a
conexão com o banco de dados
- desconecta_bd - faz a desconexão com o banco de dados
- executaSQL - executa uma instrução SQL no banco de dados
Propriedades e variáveis:
- strNomeServidor -
String : indica o nome do servidor que contém o banco de dados
- strCaminho - String : indica o caminho da base de dados
- icursorLocation - Integer : indica o tipo de cursor usado.
- nomeUsuario - String
- senhaUsuario - String
- nomeBaseDados - String
Variáveis relacionadas a banco de dados
- sql - String : usado para conter a instrução SQL
- cmd - Command : indica um objeto Command ADO
- con - Connection : indica um objeto Connection ADO
- rs - Recordset : indica um objeto Recordset ADO
Variáveis genéricas
- msg - String : usado
para exibir mensagens de eventos
- ok - Boolean : indica se um processo foi concluído ou não.
Eventos
- Erro_Acesso_Dados
Constantes :
- DTACCESS - indica
acesso a banco de dados Access
- DTSQL - Indica acesso a banco de dados SQL Server
- DTLOCAL - indica acesso local
- DTSERVER - indica acesso a servidor.
Constantes para estado do banco de dados
-Private Const
adStateClosed = 0
-Private Const adStateOpen = 1
-Private Const adStateConnecting = 2
-Private Const adStateExecuting = 4
-Private Const adStateFetching = 8
É claro que você pode incluir mais propriedades , métodos e funcionalidades ,
mas com o esboço acima podemos ter uma visão geral do que nossa classe irá fazer
e como podemos implementá-la.
A idéia é criar uma DLL de forma que possa ser usada em todos os seu projetos via referência no projeto Visual Basic. Então vamos começar abrindo o VB e criando um projeto do tipo ActiveX DLL
Ao iniciar , o projeto apresenta um módulo de classe onde iremos inserir nosso código. O nome dado ao projeto será ConectaBDADO e o nome dado a nossa classe será AcessoBD , conforme figura acima.
Vamos agora ao código da classe - AcessoBD :
1- Na seção - General Declarations - temos as declarações as propriedades , variáveis e constantes usadas pela classe
Option
Explicit ' Esta classe realiza a conexão com uma fonte de dados usando ADO ' variáveis de banco de dados Private sql As String ' consultas sql Private cmd As Command ' objeto Ado Command Private con As Connection ' objeto Ado Connection Private rs As Recordset ' objeto Ado Recordset ' variáveis expostas via propriedades Private strNomeServidor As String ' nome do servidor Private strCaminho As String ' caminho da base de dados Private icursorLocation As Integer Private nomeUsuario As String Private senhaUsuario As String Private nomeBaseDados As String ' variáveis de uso geral não expostas via propriedades Private ok As Boolean ' indica que um processo foi terminado Private msg As String ' usado em eventos externos ' Evendos publicos Public Event erroAcessoDados(sz_errmsg As String) ' Constantes de tipo de acesso Const DTACCESS = 1 Const DTSQL = 2 ' constantes de cursor Const DTLOCAL = 1 Const DTSERVER = 2 ' constantes de banco de dados Private Const adStateClosed = 0 Private Const adStateOpen = 1 Private Const adStateConnecting = 2 Private Const adStateExecuting = 4 Private Const adStateFetching = 8 |
2- O método conecta_BD recebe um inteiro que informa o tipo de base de dados com a qual desejamos realizar a conexão.
Public
Sub conecta_bd(DBType As Integer) ' Esta função recebe um inteiro que indica que tipo de conexão de banco de dados deverá ser feita Dim strConnect As String On Error GoTo errorhandler ' selecione os parametros da conexão baseado no tipo de banco de dados passado ao método Select Case DBType Case DTSQL ' inclui o nome do servidor , usuario e senha na string de conexao strConnect = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=" & nomeUsuario & _ ";Password=" & senhaUsuario & ";Initial Catalog=" & nomeBaseDados & ";Data Source=" ' inclui o caminho do banco de dados strConnect = strConnect & strNomeServidor ' define o provedor con.Provider = "SQLOLEDB.1" ' define o provedor con.ConnectionString = strConnect ' define o cursor do lado do cliente con.cursorlocation = adUseClient ' define o tempo de timeout con.CommandTimeout = 60 ' define o modo para leitura e escrita con.Mode = adModeReadWrite Case DTACCESS ' inclui o nome do servidor na string de conexao strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=" 'inclui o caminho do banco de dados strConnect = strConnect & strCaminho ' define o provedor con.Provider = "Microsoft.Jet.OLEDB.4.0" ' define a strinig de conexao con.ConnectionString = strConnect ' define o tipo de cursor con.cursorlocation = icursorLocation ' define o timeout con.CommandTimeout = 60 Case Else RaiseEvent erroAcessoDados("Tipo de banco de dados não reconhecido.") End Select ' abre a conexao con.Open Exit Sub errorhandler: msg = "Erro na conexão : " & Err.Description RaiseEvent erroAcessoDados(msg) End Sub |
3- O método executaSQL executa uma instrução SQL e retorna um recordset.
Public Function executaSQL(sql As String) As
Recordset Set rs = New Recordset 'define os parâmetros do recordset rs.CursorType = adOpenStatic rs.cursorlocation = adUseClient rs.LockType = adLockOptimistic rs.ActiveConnection = con ' executa a consuta e retorna um recordset rs.Open sql Set executaSQL = rs End Function |
4- O método desconecta_bd fecha a conexão com o banco de dados
Public Sub desconecta_bd() ' fehca o objeto database con.Close End Sub |
5- A propriedade caminhoBaseDados define o caminho do banco de dados: Let permite atribuir um valor a propriedade e Get obtêm o valor atribuído.
Public Property Let caminhoBaseDados(path As String) On Error Resume Next strCaminho = path End Property Public Property Get caminhoBaseDados() As String |
6- A propriedade EstadoConexao permite saber qual o status da conexão.
Public Property Get EstadoConexaoBD() As String ' Permite conhecer o modo do estado da conexão do banco de dados On Error Resume Next Select Case con.State Case adStateClosed EstadoConexaoBD = "Conexão esta fechada" Case adStateOpen EstadoConexaoBD = "Conexão esta aberta" Case adStateConnecting EstadoConexaoBD = "Conexão em andamento" Case adStateExecuting EstadoConexaoBD = "Executando instrução SQL" Case adStateFetching EstadoConexaoBD = "Retornando dados" Case Else EstadoConexaoBD = "Estado desconhecido." End Select End Property |
7- A propriedade cursorlocation permite definir e obter o estado do cursor usado na conexão.
Public Property Get cursorlocation() As Integer On Error Resume Next cursorlocation = icursorLocation End Property Public Property Let cursorlocation(location As Integer) |
8 - A propriedade SERVERNAME permite definir e obter o nome do servidor.
Public Property Get SERVERNAME() As String On Error Resume Next SERVERNAME = strNomeServidor End Property Public Property Let SERVERNAME(Name As String) |
9 - Os eventos Initialize e terminate são eventos que ocorrem na inicialização e encerramento da classe
Private Sub Class_Initialize() ' inicia variáveis com valor padrão icursorLocation = adUseClient strCaminho = App.path ' cria objeto connection Set con = New Connection End Sub Private Sub Class_Terminate() |
Após terminar o código da classe podemos gerar a DLL na opção do menu File | make conectaBDADO.dll. Pronto nossa classe de acesso esta pronta para ser usada. Vamos então fazer o teste...
Testando a classe acessoBD
Inicie um novo projeto no VB do tipo Standard EXE e no formulário padrão insira uma caixa de listagem ListBox - listbox1 -.
Vamos agora referenciar a nossa classe criada ; para isto no menu Project| References selecione a library Microsoft ActiveX Data Objects 2.x e a nossa dll - ConectaBDADO , conforme abaixo:
Agora no evento Load do formulário insira o código onde estamos usando a classe :
'
Database type constants Const DTACCESS = 1 Const DTSQL70 = 2 ' cusorlocation constants Const DTLOCAL = 1 Const DTSERVER = 2 Private Sub Form_Load() Dim con As New AcessoBD Dim sql As String Dim rs As ADODB.Recordset con.CursorLocation = DTLOCAL con.caminhoBaseDados = "c:\teste\northwind.mdb" con.conecta_bd (DTACCESS) sql = "Select * from produtos" Set rs = con.executaSQL(sql) While Not rs.EOF List1.AddItem rs(0) & " - " & rs(1) rs.MoveNext Wend con.desconecta_bd End Sub |
Perceba como ficou limpo o código do formulário. Estamos usando os métodos da classe AcessoBD ; para isto temos que instanciar um objeto desta classe através da linha de código:
Dim con As New AcessoBD
Feito isto temos acesso aos métodos e propriedades da classe via objeto con.
Vamos fazer uma conexão com o banco de dados Northwind.mdb presente na pasta c:\teste . Iremos exibir os registros da tabela Produtos.
rs(0) - representa o primeiro
campo (primeira coluna da tabela)
rs(1) - representa o segundo campo.
O resultado final será :
Embora simples, nossa classe realizou a tarefa sem problemas. Você ganhou em desempenho , escalabilidade e manutenção e seu código pode ser reusado em outro projetos.
Por hoje é só . Aguarde mais artigos sobre VB ...
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#