EXECUTEXMLREADER E EXECUTEREADER NAO FUNCIONAM
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.
Para quem possa interessar ...
E por fim a procedure
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
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
deve sair:
No VBnet eu explico depois .....
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 .....
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