EXECUTEXMLREADER E EXECUTEREADER NAO FUNCIONAM

EMERSONTADEU 20/08/2009 06:50:02
#320375
Olá senhores, com o surgimento do WPF a utilização de arquivos XML para carregar controles Hierárquicos está se tornando uma tendencia uma vez que o arquivo serirá para carregar controles, ser transmitido como base de dados etc etc sem ficar reprocessando.
Um exemplo legal é o preenchimento de TreeViews (sempre problemáricas) simplesmente jogando um XML em cima dela.

Mas para isto preciso que esta rotina funcione na geração do retorno do XML da minha procedure.

	Private Sub CarregaTreeView_NEW()

Using oCNN As New SqlClient.SqlConnection([Ô]BlaBlaBla[Ô])
oCNN.Open()
Dim oCMD As New SqlClient.SqlCommand([Ô]GetProductTreeXML[Ô], oCNN)

## Erro ## ==========>> [ô]Dim strXML As String = oCMD.ExecuteReader.GetSqlXml(1).Value
## Erro ## ==========>> Dim strXML2 As String = oCMD.ExecuteXmlReader.Value

A função OK !!! ==========>> LoadTreeViewFromXmlFile(strXML, TreeView1)

TreeView1.Select()
TreeView1.CollapseAll()
TreeView1.Nodes(0).Expand()
TreeView1.EndUpdate()

End Using


Para quem possa interessar ...


	[ô] Load a TreeView control from an XML file.
Private Sub LoadTreeViewFromXmlFile(ByVal file_name As String, ByVal trv As TreeView)
Dim xml_doc As New XmlDocument

[ô] Load the XML document.
[ô]xml_doc.LoadXml(file_name)

[ô] Or from Memory ...
xml_doc.Load(file_name)

[ô] Add the root node[ô]s children to the TreeView.
trv.Nodes.Clear()

AddTreeViewChildNodes(trv.Nodes, xml_doc.DocumentElement)

[ô]Collapse Trv
trv.CollapseAll()

End Sub

[ô] Add the children of this XML node to this child nodes collection.
Private Sub AddTreeViewChildNodes(ByVal parent_nodes As TreeNodeCollection, ByVal xml_node As XmlNode)
For Each child_node As XmlNode In xml_node.ChildNodes
[ô] Make the new TreeView node.
Dim new_node As TreeNode = parent_nodes.Add(child_node.Attributes.Item(0).Value, child_node.Attributes.Item(1).Value)

[ô] Recursively make this node[ô]s descendants.
AddTreeViewChildNodes(new_node.Nodes, child_node)

[ô] If this is a leaf node, make sure it[ô]s visible.
If new_node.Nodes.Count = 0 Then new_node.EnsureVisible()

Next child_node

End Sub


E por fim a procedure

 
-- ===============================================
-- Create stored procedure with OUTPUT parameters
-- ===============================================
-- Drop stored procedure if it already exists
IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.ROUTINES
WHERE SPECIFIC_SCHEMA = N[ô]dbo[ô]
AND SPECIFIC_NAME = N[ô]GetProductTreeXML[ô]
)
DROP PROCEDURE dbo.GetProductTreeXML
GO

CREATE PROCEDURE dbo.GetProductTreeXML
--@pTree xml OUTPUT
AS
--SELECT @pTree =
SELECT [ô]root[ô]
,(SELECT
g.id_Grupo
,g.nm_Grupo
,(SELECT
f.id_Familia
,f.nm_Familia
,(SELECT
s.id_subFamilia
,s.nm_subFamilia
FROM
subfamilia s
WHERE
s.id_Grupo = f.id_Grupo and s.id_Familia = f.id_Familia FOR XML AUTO, TYPE)
FROM
familia f
WHERE
f.id_Grupo = g.id_Grupo FOR XML AUTO, TYPE )
FROM
grupo g FOR XML AUTO, TYPE, ROOT)


GO




EMERSONTADEU 20/08/2009 18:58:25
#320466
Erro na procedure: (Não se deve colocar uma coluna extra chave, vc vai precisar do retorno tipo xml e não uma coluna como estava

 

CREATE PROCEDURE dbo.GetProductTreeXML
--@pTree xml OUTPUT
AS
--SELECT @pTree =
SELECT [ô]root[ô] ,(SELECT


Correto :

Citação:

CREATE PROCEDURE dbo.GetProductTreeXML
--@pTree xml OUTPUT
AS
--SELECT @pTree =
(SELECT



deve sair:
SELECT [ô]root[ô]                    ,



No VBnet eu explico depois .....
EMERSONTADEU 20/08/2009 22:26:01
#320478
  
Private Sub CarregaTreeView_NEW()

Using oCNN As New SqlClient.SqlConnection([Ô]BlablablaconnectBleBleBle[Ô])
oCNN.Open()
Dim oCMD As New SqlClient.SqlCommand([Ô]SELECT [Database].[dbo].[FnGetProductTreeXML] (1,1,1)[Ô], oCNN)
Dim myxml As New XmlDocument
myxml.Load(oCMD.ExecuteXmlReader)
Me.TreeView1.BeginUpdate()
Me.TreeView1.Nodes.Clear()
Me.TreeView1.Nodes.Add([Ô]Parent[Ô], mstrTREEVIEWROOTNAME, 0, 0)
AddTreeViewChildNodes(Me.TreeView1.Nodes, myxml.DocumentElement)
Me.TreeView1.Select()
Me.TreeView1.CollapseAll()
Me.TreeView1.Nodes(0).Expand()
Me.TreeView1.EndUpdate()

End Using



Obviamente algumas coisas mudaram, resolvi criar functions no BD ao invez de procedure já que trenho retorno escalar (1 registro em 1 coluna) e ao invez de tentar fazer reader funcionar eu pego o XML diretamente do command ... ficou melhor assim.

Assunto encerrado, vou pontuar a melhor resposta ... valew galera, espero que ajude alguém .... para mim será o método de carregar todos controles que necessitem dados hierarquicos !
Tópico encerrado , respostas não são mais permitidas