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:
Um programa cliente envia uma solicitação (consulta, gravação, etc..) através de rede para um banco de dados centralizado em um servidor
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:
Você possui o SQL Server 2000/7.0 instalado - Pode ser a versão Desktop. (É a que eu estou usando...)
Você possui noções sobre banco de dados relacionais e já sabe o que é um campo, um registro , uma tabela , um banco de dados
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 :
Configurar a conexão
Estabelecer e Terminar sessões com as fontes de dados
Identificar um provedor OLE DB
Executar uma Consulta ( Query )
Gerenciar transações na abertura da conexão
Escolher o tipo de cursor disponível para o provedor
Ao escrever uma string de conexão para ser usada com o provedor SQLOLEDB você deve usar :
a propriedade Initial Catalog para definir o banco de dados a acessar
a propriedade Data Source para definir o nome do servidor
a propriedade User ID para definir o usuário que esta se logando no servidor
a propriedade Password para definir a senha usada na conexão
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 )
Execute o EnterPrise Manager e abra a raiz hierárquica até o item Logins da pasta Security. (Veja abaixo)
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
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.
Inicie um novo projeto no Visual Basic e no formulário padrão insira : 4 caixas de texto ( txtservidor, txtbancobd, txtusuario e txtsenha) , 4 labels , 5 botôes de comando ( cmd1 , cmd2 , cmd3 , cmd4 e cmd5 ) e mais algumas perfumarias como na figura abaixo:
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() |
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
Source - É o nome do banco de dados ou instrução SQL
ActiveConnection - Contém a string definida para conexão
CursorType - Define o tipo de cursor usado . O padrão é adOpenForwardOnly.(temos também o adOpenDynamic )
LockType - Indica qual tipo de bloqueio o provedor irá usar : adLockReadOnly (1), adLockPessimistic (2), adLockOptimistic (3) ou adLockBatchOptimistic.
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 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() |
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:
MoveFirst - Movimenta o ponteiro para o primeiro registro
MovePrevious - Movimenta o ponteiro para o registro anterior
MoveNext - Movimenta o ponteiro para o próximo registro
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: