VB - Como acessar um banco de dados Remoto


Frequentemente eu recebo questões relacionadas com o acesso remoto a banco de dados usando o Visual Basic. Parece que a pergunta não quer calar: Como acessar um banco de dados Remoto usando o Visual Basic ?

Existem muitas formas de acessar um banco de dados remoto , em rede local , na internet , intranet etc. Você pode usar ASP , PHP , Cold Fusion , ASP.NET , Pearl, etc. Mas você quer acessar um banco de dados através de sua aplicação VB não é mesmo ?

Antes de mostrar uma das maneiras de fazer isto você deve levar em consideração alguns fatores que eu considero fundamentais nesta questão:

  1. Segurança - O acesso via aplicação VB é suficientemente seguro para o tipo de informação que vai transitar na rede. (Você acha que alguma instituição financeira usa este tipo de acesso em suas solução de internet banking ? )
  2. Desempenho - O desempenho obtido esta dimensionado adequadamente ao volume de informações que irão transitar pela rede. Qual o o volume de dados e o tempo de resposta que você esta disposto a negociar para que a esta solução seja viável. ?
  3. Custos - Os custos de implementação, manutenção , segurança , etc são adequados . Vale a pena gastar tempo e dinheiro nesta solução. ?

Considerando que você tenha pesado bem os fatores acima mencionados , e outros que julgar relevantes , vou passar a mostrar como você pode acessar um banco de dados remoto. Nesta solução eu vou estar acessando um banco de dados Access remotamente usando duas aplicações VB : a aplicação cliente , que solicita os dados , e a aplicação servidor que atende as solicitações e responde com a informação desejada. (Em uma rede local ou internet ou intranet sempre teremos quem faz a requisição e sempre teremos quem atende a requisição. Se você usar ASP , por exemplo , as páginas ASP no cliente fazerm a requisição e o servidor que atende deverá possuir o ASP instalado para decifrar e atender a requisição.)

A seguir temos um panorama do nosso problema e da solução que vamos usar:

Vamos ter que construir duas aplicações : a aplicação cliente que irá rodar na máquina a partir da onde você deseja consultar e a aplicação servidor que deverá rodar na máquina onde esta localizando o banco de dados que você quer acessar.

A estrutura da tabela Produtos é dada abaixo:

Vou usar a coluna CódigoDoProduto para selecionar o produto desejado e obter os campos NomeDoProduto e PreçoUnitário.

Vou usar o componente Winsock para realizar o acesso remoto. Eu aconselho que você leia os artigos abaixo para se familiarizar com os conceitos relativos ao componente Winsock:

  • VB6 - Usando o Controle Winsock
  • VB6 - Winsock : simulando o Telnet
  • Usando o Controle Winsock - II - Que tal um Chat ....
  • Criando a aplicação Cliente

    Nossa aplicação cliente possuirá um único formulário e os controles : Winsock , TextBox , Shape , Label e CommandButton conforme o layout da figura abaixo:

    Controles :

    CommandButton: name/Caption/Style - Graphical 1 - backcolor

    • cmdConectar - Conectar - verde
    • cmdEnviar - Enviar Dados - amarelo
    • cmdEncerrar - Encerrar - vermelho

    TextBox : name

    • txtItem
    • txtNomeProduto
    • txtPrecoProduto

    Winsock : Name

    • Winsock1

    Shape : name

    • shpOK (verde)
    • shpEsperar (amarelo)
    • shpErro (vermelho)

    Informações que a aplicação cliente deverá conhecer:

    A seguir temos o código da aplicação Cliente :

    Option Explicit
    Dim strmsgDados As String

    Private Sub cmdConectar_Click()

    '
    altere o valor para o ip/porta do servidor com o qual deseja conectar
    If Not Winsock1.State = sckConnected Then
       
    Winsock1.RemoteHost = "127.0.0.1"
       Winsock1.RemotePort = 80

       Winsock1.Connect
       shpOK.Visible = True
       txtItem.SetFocus
    Else
       Label3.Caption = " Já existe uma conexão com o Host."
    End If
    End Sub


    Private Sub cmdEnviar_Click()

    If Winsock1.State = sckConnected Then
      
     Winsock1.SendData txtItem.Text
       shpOK.Visible = True
       Label3.Caption = "Enviando dados..."
    Else
       shpOK.Visible = False
       shpEsperar.Visible = False
       shpErro.Visible = True
       Label3.Caption = "Não existe conexão com o host."
    End If
    End Sub


    Private Sub cmdEncerrar_Click()
       Winsock1.Close
       shpOK.Visible = False
       shpEsperar.Visible = False
       shpErro.Visible = True
    End Sub


    Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)

    Dim sDadosRecebidos As String
    Dim sDados() As String

    'recebe os dados do servidor
    Winsock1.GetData sDadosRecebidos, vbString

    If sDadosRecebidos = "Null" Then
       strmsgDados = "Não há dados para este código."
    Else
      
     'separa os dados
       sDados() = Split(sDadosRecebidos, "@")

      
     'exibe os dados
       txtNomeProduto.Text = sDados(0)
       txtPrecoProduto.Text = Format(sDados(1), "###0.00")

     
      'envia mensagem
       strmsgDados = "Dados exibidos com sucesso."

    End If

    shpOK.Visible = True
    shpEsperar.Visible = False
    shpErro.Visible = False

    End Sub


    Private Sub Winsock1_SendComplete()

          Label3.Caption = "Transmissão de dados concluida." & vbCrLf & strmsgDados

    End Sub

    1- Ao executar o projeto você deverá informar o código do produto na primeira caixa de texto e clicar no botão Conectar

       Winsock1.RemoteHost = "127.0.0.1"
        Winsock1.RemotePort = 80

       Winsock1.Connect

    2- Após feita a conexão você pode clicar no botão enviar para que os dados sejam enviados para o host de destino

     Winsock1.SendData txtItem.Text

    3- Ao receber a resposta do host você deverá verificar se há dados válidos . Se os dados forem válidos usamos a função split do VB6 para extrair os dados e exibí-os nas caixas de textos pertinentes:(O delimitador usado é o arroba - @)

    if sDadosRecebidos = "Null" Then
       strmsgDados = "Não há dados para este código."
    Else
       'separa os dados
       sDados() = Split(sDadosRecebidos, "@")

       'exibe os dados
       txtNomeProduto.Text = sDados(0)
       txtPrecoProduto.Text = Format(sDados(1), "###0.00")

       'envia mensagem
       strmsgDados = "Dados exibidos com sucesso."

    End If

    A aplicação cliente já esta pronta , mas ela é inútil se não houver uma aplicação que atenda sua requisição e de a resposta deseja. Esta é aplicação servidor.

    Criando a aplicação Servidor

    Controles:

    ListBox - List1

    Label : name

    • lblHostID
    • lblEndereco
    • lblConexoes

    CommandButton

    • cmdLimpar

    O que a aplicação Servidor deverá conhecer:

    Abaixo temos o código da aplicação servidor:

    Option Explicit
    Dim iSockets As Integer
    Dim msgServidor As String
    Dim sCodigoRequisicao As String

    Private Sub Form_Load()

      Form1.Show
      lblHostID.Caption = Socket(0).LocalHostName
      lblEndereco.Caption = Socket(0).LocalIP
      Socket(0).LocalPort = 80
      msgServidor = "Escutando na porta : " & Socket(0).LocalPort
      List1.AddItem (msgServidor)
      Socket(0).Listen

    End Sub



    Private Sub socket_ConnectionRequest(Index As Integer, ByVal requestID As Long)

    msgServidor = "Requisição de conexão : " & requestID & " enviada por : " & Socket(Index).RemoteHostIP

    If Index = 0 Then

      List1.AddItem (msgServidor)
      sCodigoRequisicao = requestID
      iSockets = iSockets + 1
      lblConexoes.Caption = iSockets

      Load Socket(iSockets)

      Socket(iSockets).LocalPort = 80
      Socket(iSockets).Accept requestID
    End If

    End Sub



    Private Sub socket_DataArrival(Index As Integer, ByVal bytesTotal As Long)

    Dim sItemDados As String
    Dim strDados As String
    Dim strDadosSaida As String
    Dim strConexao As String


    ' recebe dados do cliente
    Socket(Index).GetData sItemDados, vbString
    msgServidor = "Dados Recebidos : " & sItemDados & " de > " & Socket(Index).RemoteHostIP & "(" & sCodigoRequisicao & ")"
    List1.AddItem (msgServidor)

    strConexao = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=c:/teste/Northwind.mdb; Mode=Read|Write"

    Dim rs As New ADODB.Recordset

    ' Recebe requisiçao do cliente para o banco de dados
    strDados = "CódigoDoProduto = '" & sItemDados & "'"

    'abre o recordset e realiza uma busca nos dados do codigo do produto
    rs.Open "select * from Produtos", strConexao, adOpenKeyset, adLockOptimistic
    rs.Find strDados

    If rs.EOF Then
       strDadosSaida = "Null"
    Else
       strDadosSaida = rs.Fields("NomeDoProduto") & "@" & rs.Fields("PreçoUnitário")
    End If

    'envia dados ao cliente
    msgServidor = "Enviando resposta : " & strDadosSaida & " para " & Socket(Index).RemoteHostIP
    List1.AddItem (msgServidor)
    Socket(Index).SendData strDadosSaida

    End Sub


    Private Sub cmdLimpar_Click()
       List1.Clear
    End Sub


    Private Sub socket_Close(Index As Integer)

      msgServidor = "Conexão fechada : " & Socket(Index).RemoteHostIP
      List1.AddItem (msgServidor)
      Socket(Index).Close
      Unload Socket(Index)
      iSockets = iSockets - 1
      lblConexoes.Caption = iSockets

    End Sub

    1- A aplicação servidor atende a requisição do cliente e recebe os dados

    Socket(Index).GetData sItemDados, vbString

    2- Abre a base de dados

    strConexao = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=c:/teste/Northwind.mdb; Mode=Read|Write"

    3- Monta a requisição para efetuar a busca na tabela Produtos

    strDados = "CódigoDoProduto = '" & sItemDados & "'"

    4- Abre o recordset e faz a busca de dados

    rs.Open "select * from Produtos", strConexao, adOpenKeyset, adLockOptimistic
    rs.Find strDados

    5- Verifica se os dados foram encontrados e monta a string que devera ser devolvida ao cliente

    f rs.EOF Then
       strDadosSaida = "Null"
    Else
       strDadosSaida = rs.Fields("NomeDoProduto") & "@" & rs.Fields("PreçoUnitário")
    End If

    6- Envia os dados ao cliente

    Socket(Index).SendData strDadosSaida

    Creio que agora você já pode testar o projeto. Eu vou fazer o teste na minha máquina local (ip - 127.0.0.1) usando a porta 80 .

    Execute primeiro a aplicação cliente e a seguir a aplicação servidor. Clique no botão - Conectar - informe um código de produto que deseja consultar e a seguir clique no botão - Enviar Dados. O resultado poderá ser visto como na figura abaixo:

    Acabamos de acessar um banco de dados remoto usando Winsock. É uma aplicação simples que você pode melhorar e incrementar com tratamento de erros , e outras funcionalidades.

    O código completo dos dois projetos está no Super CD Visual Basic

    Até o próximo artigo


    José Carlos Macoratti