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
On Error Resume Next

caminhoBaseDados = strCaminho
End Property

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)
On Error GoTo errorhandler

Select Case location
 Case DTLOCAL
   icursorLocation = adUseClient
 Case DTSERVER
   icursorLocation = adUseServer
 Case Else

End Select

  Exit Property
errorhandler:
RaiseEvent erroAcessoDados(" Cursor Inválido.")

End Property

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)
  On Error Resume Next
  strNomeServidor = Name

End Property

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()
Set con = Nothing
Set rs = Nothing

End Sub

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 ...


José Carlos Macoratti