

| com exemplos em VB |
| Componente para deixar forms em Vb semelhantes às telas do winnamp |
| Componente para colocar sua aplicação VB no Systray |
| Componente para transformar sua aplicação VB em serviço |
| Ferramentas úteis para quem usa Olap Server |
| |

![]() |
||||||||
|
|
||||||||
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