Acessando dados no SQL Server com o VB - Usando ADO via código 


 Em artigos anteriores  - VB e SQLServer - O Acesso aos dados e a migração. e Acessando dados no SQL Server com o VB , tivemos a oportunidade de dar os primeiros passos em direção ao SQL Server. Neste artigo vou mostrar como acessar uma fonte de dados SQL Server ( eu estou usando a versão 2000 )  usando ADO via código.

Para pode acompanhar e testar os exemplos deste artigo você vai precisar ter o SQL Server e o Visual Basic 5 ou 6 ( A ADO deve estar instalada e atualizada até a versão 2.6 - de preferência ). Vou repetir uma parte da introdução do artigo anterior para você lembrar de alguns detalhes importantes.Ao trabalho...

O SQL Server 2000 é um banco de dados relacional compatível com a arquitetura Cliente/Servidor.  Nesta arquitetura o banco de dados fica residente no Servidor - um computador central - tendo suas informações compartilhadas por diversos usuários que acessam o Servidor através de computadores locais.

A arquitetura Cliente/Servidor para banco de dados funciona assim:

  1. Um programa cliente envia uma solicitação (consulta, gravação, etc..) através de rede para um banco de dados centralizado em um servidor

  2. O servidor processa a requisição e retorna o resultado ao cliente. 

Quer um exemplo de arquitetura Cliente/Servidor ? Ora, não pense duas vezes : A Internet.

Iniciando com o SQL Server 2000

É claro que não faz parte do objetivo deste artigo abordar em detalhes o SQL Server 2000. Nosso objetivo será mostrar como acessar os dados em um banco de dados no SQL Server 2000. Para isto eu estou partindo do seguinte pressuposto:

  1. Você possui o SQL Server 2000/7.0 instalado - Pode ser a versão Desktop. (É a que eu estou usando...)

  2. Você possui noções sobre banco de dados relacionais e já sabe o que é um campo, um registro , uma tabela , um banco de dados

  3. Você já tem noções sobre a ADO - ActiveX Data Object - pois nosso acesso será feito usando a ADO.

Tabelas ou Arquivos ?

Para  trabalhar com o SQL Server você precisa ter noções básicas de SQL  , precisa rever alguns conceitos básicos relacionados com o ambiente do SQL Server. Um conceito fundamento é o conceito de Tabela. O que é uma Tabela ? 

No jargão SQL , uma tabela é um conjunto de dados do mesmo tipo e estrutura.  Os elementos de uma tabela são as linhas que por sua vez são compostas de colunas. Não fique confuso , pois existe uma tendência para confundir uma tabela com um arquivo de registros. Existe uma diferença...

Preste atenção - Um arquivo é uma sequência de registros onde você pode acessar o primeiro registro e navegar para o próximo registro e assim ir até o último registro.(Um arquivo do Dbase é um exemplo de arquivo de registros).   Esta é uma visão das linguagens procedurais ; quando usamos SQL  estamos tratando com o banco de dados como um todo e com um conjunto de registros em particular. 

Não existe portanto uma ordem , uma sequência de registros e assim,  navegar pelos registros não faz sentido. As colunas das tabelas podem ser comparadas com os campos de um arquivo de registros , exceto pelo fato de que acessamos as colunas de uma tabela pelo seu nome e não pela sua posição relativa no arquivo . Se as colunas de uma tabela forem reordenadas em nada irá afetar o seu acesso via SQL.

Acessando o SQL Server com ADO via código

Existem diversas formas de você fazer uma conexão com uma base de dados SQL Server com ADO. Vamos mostrar algumas delas. A ADO pode usar qualquer provedor OLE DB para estabelecer uma conexão com uma base de dados SQL Server. O provedor é definido através da propriedade Provider do objeto Connection

O SQL Server 2000 usa o provedor SQLOLEDB para se conectar com uma instância do SQL Server , embora você também pode usar o provedor MSDASQL para manter a compatibilidade.

O objeto Connection permite :

Ao escrever uma string de conexão para ser usada com o provedor SQLOLEDB você deve usar :

Criando um usuário no SQL Server

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 :

    • o campo Name com o nome do usuário : Macoratti ( no meu caso ) 

    • o campo Password com a senha para acesso ( minha senha será : 123456 - (para aplicações reais nunca use uma senha tão secreta assim...)

    • em Database selecione a tabela Clientes

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

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

Criando a conexão com o SQL Server

1-)  A primeira forma de conexão que vou mostrar é aquela onde você informa o nome do usuário , a senha , o nome do servidor e do banco de dados a acessar através de caixas de texto e usando as propriedades pertinentes do objeto Connection faz a conexão com a fonte de dados.

É bom lembrar que você deve fazer uma referência a livraria Microsoft ActiveX Data Object 2.6 Library no seu projeto.

Na secção General Declarations do formulário insira o código abaixo: Essas variáveis serão visíveis em todo o formulário.

Dim usuario, senha, servidor, BancoDados As String
Dim sql As String
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset

a seguir insira o seguinte código no botão de comando - cmd1 ( evento Click).

Private Sub Cmd1_Click()

usuario = txtusuario.Text
senha = txtsenha.Text
servidor = txtservidor.Text
BancoDados = txtbancobd.Text

cn.Provider = "SQLOLEDB"
cn.Properties("Data Source").Value = servidor
cn.Properties("Initial Catalog").Value = BancoDados
cn.Properties("User ID").Value = usuario
cn.Properties("Password").Value = senha

cn.Open
MsgBox " Conexao efetuada com sucesso ! "

End Sub

Este código recebe os valores informados nas caixas de texto e , usando as propriedades do objeto Connection efetua a conexão com o SQL Server. 

2-) Na segunda conexão , estamos criando diretamente um recordset usando o método Open. O método Open permite definir vários itens da conexão. A sintaxe do método Open é :

recordset.Open Source, ActiveConnection, CursorType, LockType, Options

Private Sub Cmd2_Click()

usuario = txtusuario.Text
senha = txtsenha.Text
servidor = txtservidor.Text
BancoDados = txtbancobd.Text

Set rs = New ADODB.Recordset
sql = " Select * from clientes "
rs.Open sql, "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=" & usuario & ";Password=" & senha & ";Initial Catalog=" & BancoDados & ";Data Source=" & servidor & "", adOpenStatic, adLockReadOnly

MsgBox " Conexão efetuada com sucesso ", vbInformation, " Conexão 2 "

End Sub

3-) A terceira conexão ( conexão 3 ) , utiliza o provedor SQLOLEDB , e , através da string de conexão , via método Open cria uma conexão com o SQL.

Private Sub Cmd3_Click()
Dim provedor As String

usuario = txtusuario.Text
senha = txtsenha.Text
servidor = txtservidor.Text
BancoDados = txtbancobd.Text

cn.Provider = "sqloledb"
provedor = "Server='" & servidor & "';Database='" & BancoDados & "';Trusted_connection=yes"

cn.Open provedor
MsgBox " Conexão efetuada com sucesso ", vbInformation, " Conexão 3 "
cn.Close

End Sub

4-) Na conexão 4 , a string de conexão é criada ,  a conexão é aberta e depois criamos um recordset ( rs) com a instrução SQL.

O Data Source informado aqui é a máquina local ( 27.0.0.1 ).

Private Sub Cmd4_Click()

cn.ConnectionString =
"Provider=SQLOLEDB;Data Source=127.0.0.1;Initial Catalog=Clientes;Password=123456;User ID=Macoratti;"
cn.Open

Set rs = New ADODB.Recordset
Set rs.ActiveConnection = cn
rs.CursorLocation = adUseClient
sql = " Select * from clientes"

rs.Open sql
MsgBox " Conexão efetuada com sucesso ", vbInformation, " Conexão 4 "
cn.Close

End Sub

5-) Na conexão 5 , usamos um DSN  ( Clique aqui para ver como criar um DSN ) criado anteriormente para fazer uma conexão com o SQL Server . O nome do DSN é conSQLServer.

Private Sub cmd5_Click()

cn.ConnectionTimeout = 100
cn.Open "conSQLServer", "Macoratti", "123456"
'cn.Open "conSQLServer", "sa", ""

MsgBox " Conexão efetuada com sucesso ", vbInformation, " Conexão 5 "
cn.Close

End Sub

No método Open , informamos o nome do DSN (conSQLServer) , o nome do Usuário ( Macoratti ) e, a senha ( 123456 ).

A exibição e a navegação pelos registros

I)  Exibindo Registros do recordset

Bem , como já temos a conexão criada , podemos então partir para exibir os registros e permitir que o usuário navegue pelos mesmos e realize qualquer operação com o recordset,  vamos mostrar como filtrar os registros com base em uma condição usando SQL.  Já temos meio caminho andado.  Vamos então exibir os registros do banco de dados Clientes . A tabela clientes possui a seguinte estrutura:

Vamos exibir somente as colunas Nome , Endereço e Nascimento . Criaremos então uma rotina para exibir os dados. Vamos chamar a Procedure de : Mostra_dados. Eis os seu código :

Private Sub mostra_dados()

With rs
If .BOF And .EOF Then
   MsgBox "Não há dados para exibir ! "
Else
   txtnome = .Fields("Nome")
   txtendereco = .Fields("Endereco")
   txtnascimento = .Fields("Nascimento")
End If
End With

End Sub

Simples , não é mesmo ! . Ela apenas atribui as caixas de texto o valor dos campos.  A propriedade BOF indica  que o registro atual esta antes do primeiro registro e a EOF indica que o o registro atual esta depois do último registro , com ambos sendo verdadeiros temos que não registros no recordset.  Neste código usamos o as coleção Fields do objeto Field para exibir o conteúdo das colunas da tabela Clientes.  Os nomes são exibidas em três caixas de texto , chamadas respectivamente de : txtnome, txtendereco e txtnascimento. Abaixo o novo layout do formulário:

Para exibir os dados usamos um controle Frame como Container das caixas de texto

 

Abaixo os botões de comando que permitem a navegação pelos registros , e o botão que irá filtrar os dados conforme uma condição.

 

A procedure Mostra_dados deverá ser inserida no formulário do projeto . Para exibir os dados basta fazer a chamada da procedure após fazer a conexão . Como temos cinco conexões  vamos escolher uma delas , e , para as demais o procedimento será idêntico.

Vamos escolher a conexão 1, poderia ser qualquer uma. A conexão , se você  não cria um recordset , apenas faz a conexão com o SQL Server, então vamos precisar criar um recordset com as colunas : nome, endereço e nascimento e apos criar o recordset vamos chamar a procedure Mostra_dados para que os dados sejam exibidos . Abaixo o código da conexão já ajustado:

Private Sub Cmd1_Click()

usuario = txtusuario.Text
senha = txtsenha.Text
servidor = txtservidor.Text
BancoDados = txtbancobd.Text

cn.Provider = "SQLOLEDB"
cn.Properties("Data Source").Value = servidor
cn.Properties("Initial Catalog").Value = BancoDados
cn.Properties("User ID").Value = usuario
cn.Properties("Password").Value = senha

cn.Open

sql = "Select nome, endereco, nascimento from clientes"

rs.CursorLocation = adUseClient
rs.Open sql, cn, adOpenForwardOnly, adLockPessimistic

habilita_botoes
mostra_dados

End Sub

Vamos analisar o que fizemos de novo:

a-) Definimos uma string para montar a instrução SQL que será usada para gerar o nosso recordset. : sql = "Select nome, endereco, nascimento from clientes"

b-) Definimos o tipo de cursor como sendo do lado cliente: rs.CursorLocation = adUseClient    

c-) Invocamos a procedure habilita_botoes . Esta rotina apenas torna disponível os botões de comando, pois em tempo de projeto definimos a propriedade Enabled de cada um como False. Isto deve ser feito apos a conexão ter sito efetivada , pois se o usuário clicar no botão antes disto ocorrerá um erro. O código da procedure é :

Private Sub habilita_botoes()
  cmdprimeiro.Enabled = True
  cmdanterior.Enabled = True
  cmdproximo.Enabled = True
  cmdultimo.Enabled = True
  cmdfiltrar.Enabled = True
End Sub

d-) Invocamos a procedure mostra_dados. Com isto os dados serão exibidos de imediato.

II)  Navegando pelos registros

A navegação pelos registros não tem segredo algum ; aqui usamos os métodos do objeto Recordset:

  1. MoveFirst - Movimenta o ponteiro para o primeiro registro

  2. MovePrevious - Movimenta o ponteiro para o registro anterior

  3. MoveNext - Movimenta o ponteiro para o próximo registro

  4. MoveLast - Movimenta o ponteiro para o último registro

Durante a movimentação do ponteiro vamos usar as propriedades BOF e EOF para verificar se não estamos no início ou fim do arquivo. O código é muito simples e não vamos perder tempo com ele . A seguir o código associado ao evento click do respectivo botão de comando:

1- Código do botão de comando cmdprimeiro : vai para o primeiro registro.

Private Sub cmdprimeiro_Click()
With rs
   If .BOF And .EOF Then
       MsgBox "Não há dados no arquivo ", vbInformation
   Else
       .MoveFirst
        mostra_dados
    End If
End With
End Sub

2- Código do botão de comando cmdanterior: vai para o registro anterior.

Private Sub cmdanterior_Click()

With rs
    If .BOF And .EOF Then
            MsgBox "Não há dados no arquivo ", vbInformation
    Else
           .MovePrevious
           If .BOF Then
                 .MoveFirst
                  MsgBox "Chegamos ao primeiro registro !"
           Else
                   mostra_dados
           End If
    End If
End With

End Sub

 3- Código do botão de comando cmdproximo: vai para o próximo registro.

Private Sub cmdproximo_Click()
With rs
       If .BOF And .EOF Then
            MsgBox "Não há dados no arquivo ", vbInformation
       Else
            .MoveNext
             If .EOF Then
                  .MoveLast
                  MsgBox "Chegamos ao ultimo registro !"
             Else
                  mostra_dados
             End If
        End If
End With

End Sub

4- Código do botão de comando cmdultimo: vai para o último registro.

Private Sub cmdultimo_Click()
With rs
    If .BOF And .EOF Then
         MsgBox "Não há dados no arquivo ", vbInformation
     Else
         .MoveLast
         mostra_dados
     End If
End With

End Sub

III)  Filtrando registros 

Vamos mostrar como implementar um filtro nos registros do recordset gerado. Nosso filtro será realizado pela coluna nome e deverá filtrar todos os clientes que possuírem o nome formado pelo criterio informado. Vamos usar uma instrução SQL onde vamos selecionar os registros que atendam esta condição . A cláusula fica assim:

sql = "Select nome , endereco , nascimento from clientes Where nome like '" & criterio & "%' ORDER BY nome"

Traduzindo:

Selecione nome, endereco e nascimento da tabela clientes Onde o nome contenha o critério informado ordernados pelo nome.

Aqui usamos a cláusula LIKE com o operador (%) . Asssim se o critério informado for a letra A, teremos:

Select nome , endereco , nascimento from clientes Where nome like 'A%' ORDER BY nome

-Serão selecionados todos as colunas que contenham a primeira letra igual a A

Observe que , como o nome é do tipo string devemos envolver o critério por aspas simples ('). O operador (%) equivale ao (*) da DAO.

O código completo associado ao evento click do botão cmdfiltrar é :

Private Sub cmdfiltrar_Click()
Dim Titulo, padrao, criterio

Titulo = "Filtrando por nome"        ' define o titulo
padrao = "A"                              ' define o valor padrao

'exibe a mensagem para definir o criterio do filtro
criterio = InputBox("Informe criterio para filtrar por nome", Titulo, padrao, 100, 100)

If criterio <> "" Then
   With rs
       .Close
       sql = "Select nome , endereco , nascimento from clientes Where nome like '" & criterio & "%' ORDER BY nome"
      .Open sql
      mostra_dados

End With
End If

End Sub

Observe que:

- fechamos o recordset ( rs.close ) para em seguida abrirmos um novo Recordset com a instrução montada com o critério informado.

- O seu recordset exibirá somente os registros filtrados para o seu critério informado. Se quiser retornar a exibir todos os registros , deverá criar um botão - Remove Filtro - ou colocar o código em algum evento pertinente. Abaixo o código no evento Click do formulário. Assim ao clicar no formulário o recordset gerado volta a exibir todos os registros:

Private Sub Form_Click()
  With rs
       .Close
      
sql = "Select nome , endereco , nascimento from clientes"
       .Open sql
        mostra_dados
  End With
End Sub

III)  Encerrando a aplicação

Para encerrar a aplicação nunca esqueça de fechar a conexão e liberar os objetos. A seguir o código do botão cmdsair:

Private Sub cmdsair_Click()
  rs.Close
  Set rs = Nothing
  cn.Close
  Set cn = Nothing
  End
End Sub

Agora acabei! Viu como não tem segredo acessar uma base de dados SQL Server com VB e ADO via código. 

Tchau...

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti