Translate this page now :



»Programação
»Programação.NET
»Banco de Dados
»Webdesign
»Office
» Certificações Microsoft 4
»Treinamentos4
»Programação 4
»Webdesign«
»Office & User Tips«
»Grupos de Usuários
»Células Acadêmicas«
intcontpiada : 118
Evoluindo
Você já está cadastrado e participa do grupo de usuários de sua cidade ? Se não, comente o porque.
 
 
Faça um pequeno teste com 10 questões de VB
.:.
Teste seus conhecimentos em Visual Basic, SQL Server e ASP 3.0 com nossas provas on-line
.:.
Aprimore seus conhecimentos em programação com nosso treinamento on-line de lógica de programação
.:.
Veja nosso calendário de treinamentos
Gostou da Página?
Então

para um amigo!
 







Pesquisa personalizada
Pesquisar Dicas:

 






Quer saber mais?
Certifique-se como MCP em SQL Server
Faça um treinamento na Búfalo Informática

Trocando dados em XML com SQL Server
Utilizando o ISAPI Filter do SQL Server para troca de dados via HTTP


Faça o download do código fonte dos exemplos deste artigo em nossa página de download

A comunicação entre servidores na web é sempre um assunto complexo, dadas as questões de segurança, as múltiplas portas de comunicação utilizadas para a realização da comunicação, os firewalls que protegem as redes, entre muitas outras questões envolvidas.

O XML veio facilitar o processo de comunicação entre aplicações trazendo um formato de dados que pode facilmente ser transmitido via protocolo HTTP, o protocolo padrão de servidores web e normalmente aceito pelos firewalls.

O SQL Server 2000 trouxe muitos recursos para permitir a disponibilização de dados via XML na Web, vamos analisar como esses recursos funcionam. Como o assunto é extenso estarei com esse artigo iniciando uma série que terá seguimento nos próximos números desta revista. Dividirei os artigos de acordo com os tipos de query possíveis, URL, XPATH, Template, POST e por fim a criação de WebServices diretamente a partir de procedures.

A disponibilização de informações via http depende da existência de um servidor Web, no caso o IIS da Microsoft, que permite a comunicação via porta 80. No menu iniciar do servidor SQL Server encontramos a uma aplicação chamada Configure SQL XML Support in IIS (na verdade um snap-in para o MMC). Através desta aplicação podemos nos conectar a um servidor IIS e configurar um diretório virtual para o SQL Server.

Devemos ter uma pasta em disco disponível para ser utilizada pelo diretório virtual. Após criado, será achamado a partir do site configurado. Por exemplo, se existe um site default que responde pelo nome da máquina (http://SERVIDOR por exemplo) um diretório virtual chamado SQL responderá como http://SERVIDOR/SQL , por exemplo.

Na primeira tela exibida ao criarmos o diretório virtual devemos dar o nome do diretório virtual e sua localização física dentro do servidor Web. Em seguida precisaremos configurar as guias Security, Data Source, Settings, Virtual Names e Advanced.



Figura 1: A 1a tela de configuração do diretório virtual do SQL Server, onde deve ser especificado nome e caminho


4 Tipos de query podem ser realizadas através deste diretório virtual : Querys via URL, baseadas em template, utilizando XPATH ou via POST. Para todas é necessário que exista uma conexão com o SQL Server. A conexão pode ser feita de duas formas : Utilizando as credencias do próprio usuário que encontra-se realizando a query ou utilizando credenciais padrões, independentemente de quem seja o usuário que esteja fazendo a query.

Na primeira opção é necessário uma maior administração, pois todos os usuários que fizerem acesso aos dados precisarão estar cadastrados no domínio em que os servidores estiverem e precisarão ter acesso ao SQL Server. Normalmente esse modelo de segurança é escolhido para Intranets ou Extranets.

A utilização de um usuário padrão de acesso a dados é utilizada ou para dar acesso público aos dados ou para transferir para a aplicação a responsabilidade de controlar quais usuários terão realmente acesso aos dados.

Desta forma, na guia security, se escolhermos a opção "Always log on as" poderemos especificar um login único para acesso ao SQL Server. O SQL Server, por sua vez, permite que seja utilizada a segurança standard ou integrada para acesso ao servidor. A escolha, aqui, depende de como encontra-se configurado o servidor de dados. Se com segurança standard, você utilizará um usuário cadastrado no próprio SQL Server, se com segurança integrada você utilizará um usuário cadastrado no sistema operacional.

Por outro lado, desejando que o usuário via Web utilize suas próprias credenciais para acesso aos dados podemos fazer isso escolhendo uma das opções mais abaixo : Use Windows Integrated Authentication ou Use Basic Authentication . No primeiro caso o login do windows será reconhecido pelo IIS, enquanto que no 2o caso o IE pedirá nome e senha para o usuário.


Figura 2 : Tela de configuração de segurança do diretório virtual do SQL Server

Tendo configurado adequadamente a guia security devemos então configurar a guia Data Source apontando para o servidor e banco de dados que serão acessados.


Figura 3 : Guia Data Source, para configuração do servidor e banco a serem acessados

Devemos então configurar a guia Settings determinando qual (ou quais) dos 4 tipos de querys que poderão ser realizadas através deste servidor (URL, template,XPATH e POST). Observe que nem sempre é o desenvolvedor que estará configurando este diretório virtual. Muitas vezes esse diretório virtual estará sendo configurado por um administrador de rede que determinará quais tipos de query os programadores poderão fazer através deste dirtório virtual.

Vamos então configurar todos os tipos de querys e testa-los um por um.

URL Querys

Feitas as configurações acima já podemos fazer querys via URL tal como o exemplo abaixo :

http://localhost/sql?sql=select+au_fname+from+authors+where+au_id='172-32-1176'+for+xml+auto&root=ROOT

Observe que existem 2 parâmetros na URL : SQL e ROOT. O parâmetro SQL contém a instrução SQL a ser executada enquanto que o parâmetro ROOT indica o nome do nó raiz do documento XML de retorno, pois o FOR XML não retorna um nó raiz. O banco em si não gera o nó raiz, ele é gerado pelo ISAPI Filter do diretório virtual a partir da identificação deste parâmetro ROOT.



Figura 4 : Guia Settings determinando quais formas de comunicação estarão habilitadas


A apresentação, neste exemplo, está sendo feita diretamente em XML. Para que a apresentação possa ser formatada é necessário utilizar uma linguagem chamada XSL. A linguagem XSL, derivada do XML, permite transformar um documento XML em outro formato que desejarmos. No exemplo deveremos transformar o XML resultante em HTML. No quadro 1 você observa o código XSL para realizar a transformação.

O arquivo XSL acima precisará estar salvo do diretório virtual criado anteriormente. Na linha da query precisamos adicionar um parâmetro, xsl, determinando o nome do arquivo XSL que será utilizado. Veja a linha da query :

http://localhost/sql?sql=select+au_fname+from+authors+where+au_id='172-32-1176'+for+xml+auto&root=ROOT&xsl=autores1.xsl

Claro que desta forma não ficou muito útil, o usuário não saberá digitar isso na URL. Desta forma este método existe para ser utilizado por aplicações. Veja os exemplos nos quadros 2, 3, 4, 5 e 6 :

<?xml version='1.0' ?> 
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version="1.0"> 
      
      <xsl:template match = '/'> 
      <HTML> 
      <BODY> 
      Nome : <b><xsl:value-of select="//authors/@au_fname" />
      </BODY> 
      </HTML> 
      </xsl:template> 
      </xsl:stylesheet>
Quadro 1 : XSL de formatação do XML retornado pelo SQL Server

<html>
<body>
<form method=get action="http://localhost/sql">
SQL : <input type=text name=sql size=50><br>
<input type=hidden name=root value="DADOS">
<input type=hidden name=xsl value="autores1.xsl">
<input type=submit value="ok">
</form>
</body>
</html>
Quadro 2 : Página HTML acessando o diretório virtual criado

 

No quadro 2 temos um formulário HTML simples com um campo chamado SQL transmitido via GET para o endereço http://localhost/sql . Observe os detalhes :

" O endereço para onde é feita a transmissão é o endereço do diretório virtual configurado para o SQL Server.

" O nome do campo transmitido é uma variável reservada já esperada pelo ISAPI Filter que controla o diretório virtual do SQL Server.

" A transmissão GET é o tipo de transmissão esperada pelo diretório virtual do SQL Server.

" Um campo hidden guarda o nome do nó raiz que será gerado.

" Um campo hidden guarda o nome do XSL que deverá ser utilizado. Poderíamos, claro, dispensar este campo e deixar o usuário ver o resultado em XML, dependendo do caso.

Desta forma podemos digitar uma instrução SQL na caixa de texto e teremos os dados em XML como respostas. Para testar precisaremos salvar esse arquivo em um site web e chamado pelo browser, algo como :

http://localhost/quadro1.asp

A digitação na caixa de texto já é bem mais simples que via URL, veja :

select au_fname from authors for xml auto

<html>
<body>
<script language=javascript>
function envia()
{
form1.sql.value="select au_fname from authors where au_id='" + txtid.value + "' for xml auto"
form1.submit()
}
</script>

<input type=text name=txtid size=10>
<input type=button value="ok" onclick="envia()">
<form method=get action="http://localhost/sql" id=form1>
<input type=hidden name=sql id=sql size=50><br>
<input type=hidden name=root value="DADOS">
<input type=hidden name=xsl value=autores1.xsl>
</form>
</body>
</html>

Quadro 3 : Código HTML para acesso ao diretório virtual do SQL Server, mas este com um tratamento mais cuidadoso em JavaScript

 

Já no quadro 3 foram feitas algumas alterações no código para que o usuário não precise digitar uma instrução SQL, mas apenas o id do autor para realizar a busca. O código javascript faz a montagem da instrução SQL a ser enviada ao servidor.

Observe que o código que montamos é mais do que uma simples alternativa para uma página ASP acessando banco de dados. As páginas do quadro 2 e 3 podem estar localizadas em qualquer servidor web, a comunicação com o banco de dados é feita através de transmissões HTTP usando outro servidor web como intermediário, o que faz com que o servidor web que hospeda o site possa estar localizado a distância do banco de dados ou até mesmo que o site esteja trocando dados com multiplos bancos de dados em multiplas localidades.

Em nenhum dos dois casos, porém, está sendo dado tratamento para a informação retornada, que está sendo exibida na forma de XML. No quadro 4, porém, fazemos isso em VB.

Private Sub cmdBuscar_Click()
'Define as variáveis : uma de comunicação, uma do documento e uma do root
Dim xHTTP As New MSXML2.ServerXMLHTTP
Dim doc As DOMDocument
Dim root As IXMLDOMElement
'Configura a comunicação, via get
'utilizando os parâmetros conforme o diretório virtual
'do sql server
'Neste caso estamos esperando um único autor, por isso não foi necessário preencher o parâmetro root
xHTTP.open "GET", "http://localhost/sql?sql=select+au_fname,au_lname+from+authors+where+au_id='" & _
txtauid.Text & "'+for+xml+auto", False

'faz a requisio xHTTP.send 'Obtem o documento e o root da resposta Set doc = xHTTP.responseXML Set root = doc.documentElement 'Verifica se valido e exibe o resultado If root Is Nothing Then MsgBox "Autor no encontrado !" Else MsgBox root.getAttribute("au_fname") & " " & root.getAttribute("au_lname") End If End Sub Private Sub cmdListar_Click() 'Define as variveis : uma de comunicao, uma do documento e uma do root Dim xHTTP As New ServerXMLHTTP Dim doc As DOMDocument Dim root As IXMLDOMElement Dim node As IXMLDOMElement 'Configura a comunicao, via get 'utilizando os parmetros conforme o diretrio virtual 'do sql server xHTTP.open "GET", "http://localhost/sql?sql=select+au_fname,au_lname+from+authors+for+xml+auto&root=DADOS", False 'faz a requisio xHTTP.send 'Obtem o documento e o root da resposta Set doc = xHTTP.responseXML Set root = doc.documentElement For Each node In root.childNodes Form2.lstAutores.AddItem node.getAttribute("au_fname") & " " & node.getAttribute("au_lname") Next Form2.Show End Sub
Quadro 4 : Aplicação VB fazendo acesso ao diretório virtual do SQL Server

 

Nesta aplicação foi feito um references para a biblioteca COM "Mcrosoft XML" (menu project->References no VB). Foi utilizado o objeto ServerXMLHTTP, que é um objeto que permite a comunicação via XML através de HTTP. Este objeto é, de certa forma, equivalente ao objeto XMLHTTP. O objeto ServerXMLHTTP, porém, é otimizado para que possa ser utilizado em um servidor, a partir de uma aplicação ASP ou um serviço instalado no servidor. O XMLHTTP, porém, possui problemas de performance o que tornam recomendável que seja usado apenas por aplicações client.

Conforme você pode observar no quadro 4 e na figura 5 com a aplicação VB foi possível fazer um tratamento mais cuidadoso da resposta fornecida pelo servidor, tanto validando a comunicação sem que o usuário veja um erro como também buscando mais informações do servidor.

Também no quadro 4 e na figura 5 você pode observar como fica o
código de um botão "Listar" para exibir todos os autores.

A possibilidade de tratamento para a resposta não é uma exclusividade do Vb. Como pode observar, o VB está fazendo uso de componentes COM. Tais componentes podem ser utilizados em qualquer linguagem que tenha suporte ao uso de COM, tal como o próprio VBScript. No quadro 5 você pode observar o código em VBScript fazendo o mesmo tratamento para a busca por autor e em uma listagem dos autores.

A diferença mais gritante no quadro 5 é a utilização do XMLHTTP ao invés do ServerXMLHTTP, pelo fato do código estar rodando dentro do IE, ou seja, no client.

Como podem observar, porém, a query via URL não é, sem dúvida, um método seguro de acesso a dados, já que é possível manipular a instrução SQL que está sendo enviada. No próximo artigo desta série estaremos passando para o próximo passo, as querys via XPATH.

<html>
<body>
<script language=vbscript>
Sub Pesquisar()
'Define as variáveis : uma de comunicação, uma do documento e uma do root

Dim xHTTP,doc,root

set xHTTP=createobject("MSXML2.XMLHTTP")

'Configura a comunicação, via get
'utilizando os parâmetros conforme o diretório virtual do sql server
'Neste caso estamos esperando um único autor, por isso não foi necessário preencher o parâmetro root

xHTTP.open "GET", "http://localhost/sql?sql=select+au_fname,au_lname+from+authors+where+au_id='" & txtauid.value & "'+for+xml+auto",false

'faz a requisição
xHTTP.send

'Obtem o documento e o root da resposta
Set doc = xHTTP.responseXML
Set root = doc.documentElement

'Verifica se é valido e exibe o resultado
If root Is Nothing Then
MsgBox "Autor não encontrado !"
Else
MsgBox root.getAttribute("au_fname") & " " & root.getAttribute("au_lname")
End If
End Sub

Private Sub Listar()
'Define as variáveis : uma de comunicação, uma do documento e uma do root
Dim xHTTP, doc, root,node,msg

set xHTTP=createobject("MSXML2.XMLHTTP")

'Configura a comunicação, via get
'utilizando os parâmetros conforme o diretório virtual
'do sql server
xHTTP.open "GET", "http://localhost/sql?sql=select+au_fname,au_lname+from+authors+for+xml+auto&root=DADOS", False

'faz a requisição
xHTTP.send

'Obtem o documento e o root da resposta
Set doc = xHTTP.responseXML

Set root = doc.documentElement
For Each node In root.childNodes

msg=msg & node.getAttribute("au_fname") & " " & node.getAttribute("au_lname") & vbcrlf
Next
msgbox msg
End Sub
</script>

<input type=text name=txtauid>
<input type=button name=cmdbuscar value="Pesquisar" language=vbscript onclick="Pesquisar()">
<input type=button name=cmdlistar value="Listar" language=vbscript onclick="Listar()">
</body>
</html>

 



Figura 5 : Tela resultante do botão "Listar" na mesma aplicação



Dennes Torres
MCSD,MCSE,MCDBA



� Búfalo Informática, Treinamento e Consultoria - Rua Álvaro Alvim, 37 Sala 920 - Cinelândia - Rio de Janeiro / RJ
Tel.: (21)2262-1368 (21) 9240-5134 (21) 9240-7281 e-Mail:
contato@bufaloinfo.com.br