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
Pico de luz
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

 

XML e SQL Server : Utilizando SQLXMLOLEDB e Managed Classes



O SQLXML, já citado em nosso artigo anterior, além de instalar os recursos para criação de WebServices (em sua versão 3.0), que já citamos, instala também um OLEDB Provider chamado SQLXMLOLEDB.

Este OLEDBPROVIDER nos permite fazer acesso aos recursos do SQLXML utilizando o próprio ADO.

Neste caso não estamos utilizando nenhum WebService, apenas simplificando a troca de XML com o servidor de banco. A comunicação não é feita através de HTTP, é uma conexão comum ao servidor, mas através deste provider o ADO nos expõem os recursos do SQLXML, tal como querys via XPATH, Schemas, formatação via XSL, tudo através do ADO.

O SQLXMLOLEDB Provider só trabalha na forma de recuperação de stream, ou seja, temos sempre que utilizar Commands com a propriedade adExecuteStream para obter o retorno do banco de dados, conforme foi mencionado na dica 235

Veja um exemplo do seu funcionamento :

Option Explicit
   Sub main()
   Dim oTestStream As New ADODB.Stream
   Dim oTestConnection As New ADODB.Connection
   Dim oTestCommand As New ADODB.Command
oTestConnection.Open "provider=SQLXMLOLEDB.3.0;data    provider=SQLOLEDB;data source=(local);initial catalog=Northwind;user id=sa;password="
   oTestCommand.ActiveConnection = oTestConnection
   oTestCommand.CommandText = "SELECT FirstName, LastName FROM Employees FOR    XML AUTO"
   oTestStream.Open
   oTestCommand.Properties("Output Stream").Value = oTestStream
   oTestCommand.Properties("xml root") = "root"
   oTestCommand.Execute , , adExecuteStream
oTestStream.Position = 0
   oTestStream.Charset = "utf-8"
   Debug.Print oTestStream.ReadText(adReadAll)
   End Sub
Sub Form_Load()
   main
   End Sub

Observe pela string de conexão a forma como não foi utilizado nenhum endereço Web, ou seja, a conexão não está realmente sendo feita via HTTP, é uma conexão direta ao servidor de banco.

Então qual a vantagem em comparação com o que foi exposto na dica 235 ? No exemplo desta dica todo o trabalho com o XML ficou sob responsabilidade do nosso código. Já no exemplo de uso do SQLXMLOLEDB o próprio ADO realiza o trabalho com o XML. No exemplo acima, muito básico, a única mudança foi a adição do Root, que o ADO realizou para nós, sem a necessidade de termos que fazer esse trabalho de forma "manual", sendo que este é só o começo, veremos em seguida outros recursos deste provider.

Um recurso muito interessante é a utilização da propriedade extendida "ClientSideXml", que é fornecida com o provider SQLXMLOLEDB. Essa propriedade determina que o XML seja processado no client e não no servidor de banco. Assim sendo o servidor de banco não fica sobrecarregado com a tarefa de ter que transformar seus dados em XML, essa tarefa é dividida com o client (que pode ser uma camada de componentes, por exmeplo). Observe que o SELECT contém a clausula FOR XML, mas o provider, a partir do momento em que a propriedade "ClientSideXML" está definida como true, intercepta essa clausula e faz o processamento do XML no client.

Isso pode ser comprovado ligando-se o Profiler para verificar o que o banco recebeu. Porém inicialmente você terá uma decepção : A clausula for xml auto está lá. O que deu errado ? Ocorre que o processamento no client simplesmente não funciona para a clausula for xml auto, apenas para as demais clausulas, tal como for xml raw ou explicit. Se você trocar no código o for xml auto pelo for xml raw verá que continua recebendo XML como resultado mas desta vez o select chega ao banco sem a clausula for xml, ou seja, o trabalho de gerar o XML ficou com o provider, na camada client do banco.

Vamos tornar o exemplo um pouco mais prático, preenchendo uma listbox com os valores recebidos. Para isso precisaremos carregar os objetos em um DomDocument e não podemos esquecer de fazer references para o Microsoft XML. Veja o código :

Option Explicit
   Sub main()
   Dim doc As New DOMDocument
   Dim root As IXMLDOMElement
   Dim no As IXMLDOMNode
   
   Dim oTestStream As New ADODB.Stream
   Dim oTestConnection As New ADODB.Connection
   Dim oTestCommand As New ADODB.Command
   
   oTestConnection.Open "provider=SQLXMLOLEDB;data provider=SQLOLEDB;data    source=(local);initial catalog=Northwind;user id=sa;password="
   oTestCommand.ActiveConnection = oTestConnection
   oTestCommand.CommandText = "SELECT FirstName, LastName FROM Employees for    xml raw"
   oTestStream.Open
   oTestCommand.Properties("ClientSideXML").Value = "true"
   oTestCommand.Properties("Output Stream").Value = oTestStream
   oTestCommand.Properties("xml root") = "root"
   oTestCommand.Execute , , adExecuteStream
   
   oTestStream.Position = 0
   oTestStream.Charset = "utf-8"
   doc.loadXML oTestStream.ReadText(adReadAll)
   
   Set root = doc.documentElement
   
   For Each no In root.childNodes
   
   List1.AddItem no.Attributes.getNamedItem("FirstName").Text
   Next
End Sub
   Sub Form_Load()
   main
   End Sub


A utilização do provider SQLXMLOLEDB com ADO no VB 6 é apenas um dos recursos oferecidos pelo SQLXML. Partindo para o .NET, o SQLXML fornece um conjunto de classes gerenciadas (managed classes, componentes CLS que rodam dentro do CLR) que nos permitem acessar os recursos do SQLXMLOLEDB de forma bem mais simples.

São 3 as managed classes fornecidas pelo SQLXML : SQLXMLCOMMAND, SQLXMLParameter e SQLXMLAdapter.

O Command é utilizado para realizar execução de instruções, o Parameter para preencher parâmetros no Command quando necessário e o Adapter para, utilizando o command, preencher objetos DataSet e assim poder fazer vinculação de dados.

Vamos ver como ficaria um simples formulário para exibição de dados utilizando esses recursos. Em primeiro lugar é necessário adicionar referencia ao SQLXML. Em seguida precisamos fazer o imports do namespace, para simplificar a utilização de nomes de objetos, veja :

Imports Microsoft.Data.SqlXml

Em seguida o código em si. O código se divide em duas partes : O código do form load, que executa a query e realiza um binding via código com 3 textbox no formulário e o código dos botões de navegação, esse um código comum do VB.NET que utiliza a propriedade BindingContext do formulário para fazer a navegação através dos registros.

Veja o código :

 Private Sub Form1_Load(ByVal    sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
   'Aqui os dados são recuperados e é realizada a vinculação    com as textbox
   Dim NorthwindConnString As String = "Provider=SQLOLEDB;Server=(local);database=Northwind;user    id=sa;password="
 Dim cmd As New SqlXmlCommand(NorthwindConnString)
 Dim xmlda As SqlXmlAdapter
 'Definição    dos objetos Binding, para a vinculação
   Dim b1 As New Binding("text", DS1, "row.firstname")
   Dim b2 As New Binding("text", DS1, "row.lastname")
   Dim b3 As New Binding("text", DS1, "row.birthdate")
 'Definição    do Command, para execução da instrução
   cmd.ClientSideXml = True
   cmd.RootTag = "root"
   cmd.CommandText = "select FirstName, LastName, BirthDate from Employees    for xml raw"
 'Criação    do Data Adapter
   xmlda = New SqlXmlAdapter(cmd)
 'Preenchimento de um DataSet    a partir do Data adapter
   xmlda.Fill(DS1)
 'Vinculação    das textbox, adicionando o objeto Binding na coleção DataBindings
   TextBox1.DataBindings.Add(b1)
   TextBox2.DataBindings.Add(b2)
   TextBox3.DataBindings.Add(b3)
 End Sub
 'Daqui para baixo estão    os botões de navegação
 Private Sub Button1_Click(ByVal    sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
   Me.BindingContext(DS1, "row").Position = 0
   End Sub
 Private Sub Button2_Click(ByVal    sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
   If Me.BindingContext(DS1, "row").Position > 1 Then
   Me.BindingContext(DS1, "row").Position = Me.BindingContext(DS1, "row").Position    - 1
   End If
   End Sub
 Private Sub Button4_Click(ByVal    sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
   Me.BindingContext(DS1, "row").Position = Me.BindingContext(DS1, "row").Count    - 1
   End Sub
 Private Sub Button3_Click(ByVal    sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
   If Me.BindingContext(DS1, "row").Position < Me.BindingContext(DS1,    "row").Count Then
   Me.BindingContext(DS1, "row").Position += 1
   End If
   End Sub


O próprio SQLXMLCOMMAND poderia ser utilizado, por si só, para gerar o resultado em XML. Mas neste caso o resultado seria devolvido na forma de stream ou de um objeto chamado XMLREADER, permitindo a manipulação dos dados mas não o Binding com os objetos de formulário. Com o uso do DataAdapter podemos gerar um DataSet como outro qualquer, que nos permite realizar o Binding.

Vejamos como fica isso em uma aplicação ASP.NET, uma simples grid.

Primeiramente inserimos uma datagrid em um WebForm e realizamos algumas configurações, tal como de cores e intercalação de cores.

Em seguida precisamos programar o page_load para carregar os dados. Mas para fazermos isso precisamos fazer o References do SQLXML e o Imports do Microsoft.data.SQLXML.

Isso feito, vamos ao Page_Load :

 Private Sub Page_Load(ByVal    sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
   'Put user code to initialize the page here
   Dim NorthwindConnString As String = "Provider=SQLOLEDB;Server=(local);database=Northwind;user    id=sa;password="
 Dim cmd As New SqlXmlCommand(NorthwindConnString)
 Dim xmlda As SqlXmlAdapter
 'Definição    do Command, para execução da instrução
   cmd.ClientSideXml = True
   cmd.RootTag = "root"
   cmd.CommandText = "select FirstName, LastName, BirthDate from Employees    for xml raw"
 'Criação    do Data Adapter
   xmlda = New SqlXmlAdapter(cmd)
 'Preenchimento de um DataSet    a partir do Data adapter
   xmlda.Fill(DS1)
 DataGrid1.DataSource =    DS1.Tables("row").DefaultView
   DataGrid1.DataBind()
 End Sub


A única diferença, como podem observar, fica por conta do processo de binding, já que estamos utilizando uma datagrid no ASP.NET, de resto a recuperação dos dados é identica.

Com esse artigo avançamos um pouco mais na análise dos recursos do SQLXML, ficando cada vez mais evidente a forma como a Microsoft se encaminha para uma integração entre SQL Server e XML.

 

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