Trabalhando com aplicações em 3 camadas - Parte III

Se voce chegou até aqui é por que realmente esta interessado. Agora neste terceira parte vamos criar o componente no Visual Basic para acessar os dados e realizar as tarefas de incluir , alterar e excluir dados. Como estamos tratando a camada de dados vamos encapsular o código em uma DLL.

Criando um componente no Visual Basic para a camada de dados

  1. Inicie um novo projeto no Visual Basic e selecione na New o projeto - ActiveX DLL

  1. Um novo projeto será aberto como um módulo de classe - Class1 .

    Altere o nome do projeto para Camada3 como exibido ao lado.

    Obs: Para criar uma instância da classe Clientes usaremos o código:

    Set Object = CreateObject("Camada3.Clientes")

  2. É bom salvar o seu projeto agora . Voce pode usar qualquer nome. Vamos salvar com o nome de CamadaDados.
  3. Vamos agora codificar a primeira função em nossa DLL . A função é responsável por criar uma conexão com a fonte de dados e gerar o recordset desconectado com os dados selecionados. (Se você não sabe oque é um recordset desconectado leia o artigo: Trabalhando recordsets sem uma base de dados )
  1. Não esqueça de fazer a referência biblioteca - Microsoft ActiveX Data Object 2.X Library
  2. Na seção General Declarations defina a constante para conexão com o banco de dados Clientes e a tabela clientes do SQL Server 2000 criados na parte I deste artigo.

Option Explicit
Const Conexao =
"Provider=SQLOLEDB.1;Persist Security Info=False;User_ ID=macoratti;Password=123456;Initial Catalog=Clientes;Data Source=MACORATI\MACORATTI"

  1. O código da função Acessa_Tabela é o seguinte:
Public Function Acessa_Tabela(Optional ByVal selecao As Variant, _
Optional ByVal DSN As Variant) As ADODB.Recordset

On Error GoTo trata_erro

Dim con As ADODB.Connection
Dim rst As ADODB.Recordset

If IsMissing(DSN) Then
    DSN = conexao
End If

Set con = New ADODB.Connection
con.Open DSN

Set rst = New ADODB.Recordset
With rst
  .CursorLocation = adUseClient
  .LockType = adLockBatchOptimistic
  .CursorType = adOpenForwardOnly
End With

If IsMissing(selecao) Then
     rst.Open "Select * from Clientes", con
Else
     rst.Open selecao, con
End If

Set rst.ActiveConnection = Nothing
Set Acessa_Tabela = rst
Exit Function

trata_erro:
   Set rst = Nothing
   Set con = Nothing
   Err.Raise Err.Number & "  |  " & Err.Source & "  -  " & Err.Description
End Function

A função Acessa_tabela trabalha com dois argumentos opcionais passados por valor : A seleção de registros e a string para conexão com a base de dados.

Definimos a constante conexão como :

Const Conexao = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=macoratti;Password=123456;Initial Catalog=Clientes;Data Source=MACORATI\MACORATTI"

Esta string foi definida usando os parâmetros para o meu servidor SQL Server e para a minha tabela Clientes.

Para acessar uma base de dados no SQL Server devemos definir o usuário e a senha que vai acessar o arquivo e qual banco de dados usar.  Vamos então criar o nosso usuário: Macoratti  ( no seu caso particular você define outro nome) e definir o  banco de dados - Clientes - como sendo a fonte de dados que este usuário irá acessar. ( O banco de dados Clientes foi criado no SQL Server no artigo - Acessando dados no SQL Server com o VB

  1. Execute o EnterPrise Manager e abra a raiz hierárquica até o item Logins da pasta Security. (Veja abaixo)

  1. Selecione o menu Action -> New Login ou clique com o botão direito do mouse  e selecione a opção New Login do menu suspenso. A Janela - New Login - (Ver abaixo) deverá aparecer. Nela você preenche :

  1. lique em OK e a seguir confirme a Senha. Pronto o usuário Macoratti esta criado com acesso ao banco de dados Clientes. Veja abaixo:C

Agora tudo esta pronto: O SQL Server , O banco de dados  e o usuário com a senha cadastrada... Continuemos...

A linha de código :

If IsMissing(DSN) Then
  DSN = conexao
End If

Verifica se o parâmetro DSN , que é o parâmetro com a string de conexão foi informado. Se nada for informado será usado a constante conexao já definida.

A mesma coisa ocorre com o código a seguir:

If IsMissing(selecao) Then
  rst.Open "Select * from Clientes", con
Else
  rst.Open selecao, con
End If

Verificamos se foi passada uma string para seleção dos registros. Se nada foi informado então selecionamos todos os registros do banco de dados ( cuidado com seleções deste tipo...)

Encapsulando os procedimentos armazenados

Iremos encapsular o código que utiliza os procedimentos armazenados criados na parte II deste artigo. Vamos começar com o mais simples deles : A exclusão de registros feita pela função Exclui_Registro:

1-) Função para Excluir Registros da base de dados : Exclui_Registro

Public Function Exclui_Registro(ByVal cliente_ID As Long, _
Optional ByVal DSN As Variant) As Boolean

On Error GoTo trata_erro

    Dim cmd As ADODB.Command
    Dim parametro As ADODB.Parameter
    
    Exclui_Registro = False
    
    If IsMissing(DSN) Then
        DSN = Conexao
    End If
    
    Set cmd = New ADODB.Command
    With cmd
         .ActiveConnection = DSN
         .CommandType = adCmdStoredProc
         .CommandText = "sp_excluir_clientes"
    End With
    
    Set parametro = cmd.CreateParameter("@ID", adInteger, adParamInput, 4, cliente_ID)
    cmd.Parameters.Append parametro
    
    cmd.Execute
    
    MsgBox " Registro excluido com sucesso ! "
    
    Exclui_Registro = True
    Exit Function
    
trata_erro:
    Set cmd = Nothing
    Err.Raise Err.Number & "  |  " & Err.Source & "  -  " & Err.Description
End Function

A função Exclui_Registro utiliza o objeto command para executar o procedimento armazenado - sp_excluir_clientes ; esta é uma das melhores formas de executar um procedimento armazenado. Usamos dois parâmetro de entrada : O código de identificação do Cliente e a string para a conexão.

Os parâmetros de entrada são definidos usando o objeto command e sua coleção Parameters. Uma sequência para usar o objeto commando seria:

  1. Criar o objeto Command
  2. Definir o nome do procedimento armazenado
  3. Especificar o tipo do comando que vamos usar

É claro que para funcionar o objeto command precisa de uma conexão atribuída para realizar o acesso ao banco de dados. Fazemos isto usando a instrução : cmd.ActiveConnection = DSN

Para passar os parâmetros de entrada atribuímos objetos Parameters ao objeto Command. Fazemos isto em duas etapas :

  1. Criamos o objeto Parameter
  2. Anexamos o objeto Parameter a coleção Parameters

assim :

Set parametro = cmd.CreateParameter("@ID", adInteger, adParamInput, 4, cliente_ID)
cmd.Parameters.Append parametro

A sintaxe é a seguinte:

Set ObjParam = objCmd.CreateParameter(Name, Type, Direction , Size , Value )

2-) Função para Atualizar Registros da base de dados : Altera_Registro

Vamos atualizar os registros usando a instrução UPDATE . A seguir o código da função Altera_Registro :

Public Function Altera_Registro(ByVal nID As Long, _
                                ByVal strNome As String, _
                                ByVal strEndereco As String, _
                                ByVal dNascimento As Date, _
                                ByVal strObservacao As String, _
                                Optional ByVal DSN As Variant) As Boolean
                                
On Error GoTo trata_erro

Dim con As ADODB.Connection
Dim cmd As ADODB.Command

Altera_Registro = False

If IsMissing(DSN) Then
     DSN = Conexao
End If

Set con = New ADODB.Connection
con.ConnectionString = DSN
con.Open

Set cmd = New ADODB.Command
Set cmd.ActiveConnection = con
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "sp_atualizar_clientes"

cmd.Parameters.Append cmd.CreateParameter("@ID_1", adInteger, adParamInput, 4, nID)
cmd.Parameters.Append cmd.CreateParameter("@Nome_2", adVarChar, adParamInput, 50, strNome)
cmd.Parameters.Append cmd.CreateParameter("@Endereco_3", adVarChar, adParamInput, 50, strEndereco)
cmd.Parameters.Append cmd.CreateParameter("@Nascimento_4", adDate, adParamInput, , dNascimento)
cmd.Parameters.Append cmd.CreateParameter("@Observacao_4", adVarChar, adParamInput, 100, strObservacao)
                                
cmd.Execute
Altera_Registro = True
MsgBox "Alteração realizada com sucesso !"

Exit Function
trata_erro:
    Set cmd = Nothing
    Err.Raise Err.Number & "  |  " & Err.Source & "  -  " & Err.Description
End Function

- A função Altera_Registro recebe o seguintes parâmetros de entrada:

Os parâmetros são então atribuidos ao objeto Command via objetos Parameters :

cmd.Parameters.Append cmd.CreateParameter("@ID_1", adInteger, adParamInput, 4, nID)
cmd.Parameters.Append cmd.CreateParameter("@Nome_2", adVarChar, adParamInput, 50, strNome)
cmd.Parameters.Append cmd.CreateParameter("@Endereco_3", adVarChar, adParamInput, 50, strEndereco)
cmd.Parameters.Append cmd.CreateParameter("@Nascimento_4", adDate, adParamInput, , dNascimento)
cmd.Parameters.Append cmd.CreateParameter("@Observacao_4", adVarChar, adParamInput, 100, strObservacao)

Note que é informado: o nome do parâmetro o tipo , a direção , o tamanho e o valor.

A Alteração é efetivada com o comando execute do objeto command: cmd.Execute

3-) Função para Incluir Registros da base de dados : Inclui_Registro

Para encerrar as funções usadas em nosso componente , vamos encapsular o código relativo a stored procedure : sp_incluir_clientes . O código é o seguinte:

Public Function Inclui_Registro(ByVal strNome As String, _
                                ByVal strEndereco As String, _
                                ByVal dNascimento As Date, _
                                ByVal strObservacao As String, _
                                Optional ByVal DSN As Variant) As Boolean 

On Error GoTo trata_erro

Dim con As ADODB.Connection
Dim cmd As ADODB.Command

Inclui_Registro = False

If IsMissing(DSN) Then
     DSN = Conexao
End If

Set con = New ADODB.Connection
con.ConnectionString = DSN
con.Open

Set cmd = New ADODB.Command
Set cmd.ActiveConnection = con

cmd.CommandType = adCmdStoredProc
cmd.CommandText = "sp_incluir_clientes"
cmd.Parameters.Refresh

With cmd.Parameters
  .Item(1).Value = strNome
  .Item(2).Value = strEndereco
  .Item(3).Value = dNascimento
  .Item(4).Value = strObservacao
End With

cmd.Execute
MsgBox "Registro incluido com sucesso !"
Exit Function

trata_erro:
  Set cmd = Nothing
  Err.Raise Err.Number & " | " & Err.Source & " - " & Err.Description  
End Function

- A função Inclui_Registro recebe o seguintes parâmetros de entrada:

E o código do cliente ? Ora , se não falei antes vou falar agora . O campo ID da tabela Clientes deve ser definido como do tipo Identity sendo que a Identity seed deve ser igual a 1 e o incremento (Identity increment) também é igual a 1. Em outras palavras , este campo é um campo autonumeração que será incrementado de uma unidade quando da inclusão de um novo registro. Veja abaixo:

Obs: Uma coluna Autonumeração é referida como uma coluna Identity no SQL Server 2000

Portanto nao vamos incluir um código para o cliente , o banco de dados irá realizar esta tarefa.

Os valores são incluidos no objeto Commando assim:

With cmd.Parameters
  .Item(1).Value = strNome
  .Item(2).Value = strEndereco
  .Item(3).Value = dNascimento
  .Item(4).Value = strObservacao
End With

Note que como item(0).value refere-se ao camo ID ( codigo do cliente ) , e, este campo é do tipo Identity , começamos a partir do item(1).value ate item(4).value.

Pronto ! já codificamos as 4 funções que compôem a nossa camada de dados e farão todo o tratamento dos dados :

  1. Acessa_Tabela
  2. Exclui_Registro
  3. Altera_Registro
  4. Inclui_Registro
Vamos compilar o nosso projeto e gerar o arquivo DLL. Selecione no menu File a opção Make CamadaDados.dll.

Se não houver nenhum erro de sintaxe a compilação irá ocorrer com sucesso e o arquivo camadaDados.dll será gerado e estará pronto para ser usado no seu projeto Visual Basic

Na última parte deste artigo (já estava na hora) vamos mostrar como usar o nosso componente. Veja a continuação em : Usando o componente da camada de dados


José Carlos Macoratti