Popolare con stored,xml e web services

domenica 13 maggio 2007 - 17.53

roberta123 Profilo | Newbie

Ciao,
ho il seguente problema: un webservices ha un metodo chiamato daidati senza parametri in ingresso, in pratica crea un xml ottenuto da una stored procedure con più tabelle e per ognuna ho un for xml auto. In pratica quello che ho è una situazione del genere
<autori nome="" cognome=""..../> <autori nome=""..../><titoli titolo=""..../><titoli titolo="".../>. Quindi ho più tabelle nello stesso file.

Il metodo deve essere consumato da una WebForm che popola delle RadioButtonList in base all'entità coivolta.

Io vorrei fare nella PageLoad la seguente cosa
DataSet ds=new DataSet();
ds.ReadXml(ws_datidati());
RadioButtonList1.DataSource=ds.Tables[0].Columns[1];
RadioButtonList1.DataBind()
RadioButtonList2.DataSource=ds.Tables[1].Columns[1];
RadioButtonList2.DataBind()



1)Secondo voi è concettualmente corretto?
2)Facendo una prima prova ho ottenuto come errore "Elementi di primo livello multipli" ...?!?!

Per la prova ho utilizzato ds.ReadXml(@"XMLM.xml"); ds.ReadXml(Server.MatPath(XMLM.xml));
dove questo era un file xml aggiunto al progetto e dove avevo incollato quelli generati dalla stored.

Utilizzo VS.Net 2003 e sQL 2000
Grazie

alx_81 Profilo | Guru

>Ciao,
Ciao!

>ho il seguente problema: un webservices ha un metodo chiamato
>daidati senza parametri in ingresso, in pratica crea un xml ottenuto
>da una stored procedure con più tabelle e per ognuna ho un for
>xml auto. In pratica quello che ho è una situazione del genere
><autori nome="" cognome=""..../> <autori nome=""..../><titoli
>titolo=""..../><titoli titolo="".../>. Quindi ho più
>tabelle nello stesso file.
>
>Il metodo deve essere consumato da una WebForm che popola delle
>RadioButtonList in base all'entità coivolta.
>
>Io vorrei fare nella PageLoad la seguente cosa
>DataSet ds=new DataSet();
>ds.ReadXml(ws_datidati());
>RadioButtonList1.DataSource=ds.Tables[0].Columns[1];
>RadioButtonList1.DataBind()
>RadioButtonList2.DataSource=ds.Tables[1].Columns[1];
>RadioButtonList2.DataBind()
>
>1)Secondo voi è concettualmente corretto?
Diciamo che puoi seguire quella strada.. ma in quel modo ottieni l'errore seguente

>2)Facendo una prima prova ho ottenuto come errore "Elementi di primo livello multipli" ...?!?!
Questo perchè hai più tag "autori" e manca un nodo root..
nella clausola FOR XML utilizza ROOT.. leggi questo link
http://msdn2.microsoft.com/en-us/library/ms190922.aspx

Eccoti un semplice esempio
Use tempdb; IF NOT EXISTS (SELECT * FROM sys.tables WHERE Object_ID = Object_ID('ProvaXML')) CREATE TABLE ProvaXML ( Id Int IDENTITY(1,1) PRIMARY KEY CLUSTERED, Nome varchar(30) NOT NULL, Cognome varchar(30) NOT NULL ) INSERT ProvaXML SELECT 'Alessandro','Alpi' INSERT ProvaXML SELECT 'Luca','Ferrari' INSERT ProvaXML SELECT 'Daniele','Zanella' INSERT ProvaXML SELECT 'Michael','Denny' INSERT ProvaXML SELECT 'Marco','Rossi' SELECT Nome, Cognome FROM ProvaXML FOR XML AUTO, ROOT -- elimino la tabella DROP TABLE ProvaXML


risultato in XML
<root> <ProvaXML Nome="Alessandro" Cognome="Alpi"/> <ProvaXML Nome="Luca" Cognome="Ferrari"/> <ProvaXML Nome="Daniele" Cognome="Zanella"/> <ProvaXML Nome="Michael" Cognome="Denny"/> <ProvaXML Nome="Marco" Cognome="Rossi"/> </root>
come vedi si è aggiunto il nodo che elimina la duplicazione del nodo radice (ne crea uno solo da cui derivano tutti i nodi figli)

>
>Per la prova ho utilizzato ds.ReadXml(@"XMLM.xml"); ds.ReadXml(Server.MatPath(XMLM.xml));
>dove questo era un file xml aggiunto al progetto e dove avevo
>incollato quelli generati dalla stored.

Utilizzare la tua soluzione è una via possibile.
A mio avviso è preferibile la soluzione di "messaggio tipizzato"..
Mi spiego.. Tu puoi farti una classe che mappa direttamente il ritorno del tuo metodo..
La classe identifica l'oggetto che conterrà i risultati della tua query.

Una cosa del tipo:
Class OutputXML Private _Prop1 as string Private _Prop2 as int32 Public Property Prop1 as String Get return _Prop1 End Get Set (value as string) _Prop1 = value End Set End Property Public Property Prop2 as int32 Get return _Prop2 End Get Set (value as int32) _Prop1 = value End Set End Property End Class

E poi nel tuo servizio:

<WebMethod()> _ Public Function DatiDati() As OutputXML Dim objXML As New OutputXML() 'mappi i risultati della query nelle proprietà dell'oggetto objXML.Prop1 = "prova" objXML.Prop2 = 1 return objXML End Function

La Web Form poi leggerà dal metodo il tipo di ritorno OutputXML e lo utilizzerà di conseguenza per popolare i radio button:

... Dim objRetXML as New OutputXML() RadioButtonList1.DataSource = objRetXML RadioButtonList1.DataBind() ...

Attenzione, non l'ho indicato nella classe OutputXML.. Ma per ottenere un oggetto che può essere utilizzato come datasource, devi implementare l'interfaccia IList.
http://msdn2.microsoft.com/en-us/library/system.collections.ilist.aspx
>
>Grazie
Di nulla!

Alx81 =)

http://blogs.dotnethell.it/suxstellino

roberta123 Profilo | Newbie

Grazie,
ma XML Root vale solo per SQL 2005 ed io utilizzo SQL 2000 almeno così mi è parso di capire dalla documentazione. Provo il resto.

alx_81 Profilo | Guru

>Grazie,
>ma XML Root vale solo per SQL 2005 ed io utilizzo SQL 2000 almeno
>così mi è parso di capire dalla documentazione. Provo il resto.
Sì, è così, credevo usassi SQL 2005 e non avevo visto nel primo post,
comunque puoi pensare di aggiungere i nodi <root> e </root> alla fine o tramite subquery oppure direttamente da codice..

Alx81 =)

http://blogs.dotnethell.it/suxstellino
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5