è da un pò che non gioco con l'XML di SQL ma se la mia memoria neon mi inganna puoi specificare un nodo radice così:

FOR XML PATH('Area'),ROOT('Main')

questo frammento fa parte di una query leggermente più complessa.

ma non ho mai avuto problemi a produrre XML valido

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
384 messaggi dal 26 agosto 2007
Si quel problema già l'ho risolto in questo modo:
SqlConnection Conn = new SqlConnection();
SqlCommand Cmd = new SqlCommand();
XmlDocument OggettiInVetrina = new XmlDocument();
string Query = "SELECT * FROM Tabella FOR XML PATH, ROOT('Vetrina')";
Conn.ConnectionString = "Connessione";
Conn.Open();
Cmd.CommandType = CommandType.Text;
Cmd.Connection = Conn;
Cmd.CommandText = Query;
XmlReader Read = Cmd.ExecuteXmlReader();
Conn.Close();
OggettiInVetrina.Load(Read);
Random Rnd = new Random();
XmlElement RootVetrina = OggettiInVetrina.CreateElement("Rootvetrina");
int i;
ArrayList Row = new ArrayList();
for (i = 0; i < OggettiInVetrina.DocumentElement.ChildNodes.Count; i++)
{
Row.Add(OggettiInVetrina.DocumentElement.ChildNodes[i]);
}
for (i = 0; i < 9; i++)
{
RootVetrina.AppendChild((XmlElement)Row[Rnd.Next(Row.Count - 1)]);
}
XmlDocument Vetrina = new XmlDocument();
Vetrina.AppendChild(RootVetrina);
Vetrina.Save(Server.MapPath("prova.xml"));


Però ora quando vado a fare RootVetrina.AppenaChild mi da questo errore:
The node to be inserted is from a different document context.


Che vuol dire??

Lunga vita e prosperità!!
si scura, mi era sfuggita la modifica "ROOT('Vetrina')"

l'errore è chiaro stai cercando di inserire un nodo proveniente da un altro XmlDocument.

mi rispieghi perche fai questo:
Random Rnd = new Random(); 
XmlElement RootVetrina = OggettiInVetrina.CreateElement("Rootvetrina"); 
int i; 
ArrayList Row = new ArrayList(); 
for (i = 0; i < OggettiInVetrina.DocumentElement.ChildNodes.Count; i++) 
{ 
Row.Add(OggettiInVetrina.DocumentElement.ChildNodes[i]); 
} 
for (i = 0; i < 9; i++) 
{ 
RootVetrina.AppendChild((XmlElement)Row[Rnd.Next(Row.Count - 1)]); 
} 
XmlDocument Vetrina = new XmlDocument(); 


ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
384 messaggi dal 26 agosto 2007
Praticamente faccio questo perchè devo creare una vetrina per un sito e-commerce. In vetrina possono esserci massimo 9 articoli perciò prima faccio una query al database per sapere quali articoli devo mettere in vetrina e poi con una funzione random scelgo 9 articoli a caso da far visualizzare in vetrina. L'ArrayList lo uso perchè se uso direttamente:
RootVetrina.AppendChild(OggettiInVetrina.DocumentElement.ChildNodes[Rnd.Next(OggettiInVetrina.DocumentElement.ChildNodes.Count - 1)]);

non so perchè ma durante il ciclo for il ChildNodes.Count diminuisce di uno ad ogni passaggio e quindi mi sballa tutti i conti. Spero di essermi spiegato bene
Modificato da voyager18 il 24 luglio 2008 14.13 -

Lunga vita e prosperità!!
diminuisce perche li rimuovi da un documento per inerirlo in un altro.

comunque mi sembra un approccio sbagliato tirare fuori tutti i record e poi prenderne solo alcuni

dai un occhiata quà:

http://www.aspitalia.com/script/330/Estrarre-Record-Casuali-SQL-Server.aspx


ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
384 messaggi dal 26 agosto 2007
nostromo ha scritto:
diminuisce perche li rimuovi da un documento per inerirlo in un altro.

comunque mi sembra un approccio sbagliato tirare fuori tutti i record e poi prenderne solo alcuni

dai un occhiata quà:

http://www.aspitalia.com/script/330/Estrarre-Record-Casuali-SQL-Server.aspx


ciao marco

Ho provato a creare una query di questo tipo:
"SELECT TOP 1 [Descrizione_Breve],[Listino_1],[Listino_2],[Listino_3],[Sconto_Listino_1],[Sconto_Listino_2],[Sconto_Listino_3],[Titolo],[Immagine] FROM db_datawriter.Articoli WHERE [Codice] >= (rand() * (SELECT MAX(Codice) FROM db_datawriter.Articoli)) AND [Visibile] = 'Si' AND [In_vetrina] = 'Si' FOR XML PATH, ROOT('Vetrina')"

ma mi tira fuori sempre lo stesso record.

Lunga vita e prosperità!!
prova questo :D

http://www.aspitalia.com/script/506/Estrarre-Record-Casuali-SQL-Server-Funzione-NEWID.aspx

scusa se ti rispondo a link, adesso purtroppo non ho tempo di controllare la query

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
384 messaggi dal 26 agosto 2007
nostromo ha scritto:
prova questo :D

http://www.aspitalia.com/script/506/Estrarre-Record-Casuali-SQL-Server-Funzione-NEWID.aspx

scusa se ti rispondo a link, adesso purtroppo non ho tempo di controllare la query

ciao marco

Ok grazie questo ha funzionato!!

Lunga vita e prosperità!!

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.