2012-12-03 9 views
14

Abbiamo una colonna nel database che ha un tipo di xml. Sto leggendo queste informazioni tramite il .net SqlDataReader, ma non sono sicuro su cosa trasmettere.Che cosa traduce il tipo di dati XML di SQL Server in .NET e come posso convertirlo in XmlDocument?

La tabella MSDN (http://msdn.microsoft.com/en-us/library/cc716729.aspx) suggerisce che è del tipo .net Xml, ma non c'è System.Xml, solo System.Web.UI.WebControls.Xml quindi non sono sicuro se questo è corretto.

Quindi la mia domanda è questa:

cosa ho gettato la SqlDbType.Xml come sto leggendo da un SqlDataReader, e come faccio a convertire che a XmlDocument?

+0

stai usando SqlConnection o Entity? –

+0

sto usando sqlconnection – Sinaesthetic

risposta

5

Ricordo di averlo lanciato su una stringa. L'alimentazione di XmlDocument con una stringa funziona come al solito.

+3

Mentre funziona, penso che sia preferibile lavorare con il tipo nativo. –

+0

Cosa giustifica questo giudizio? Meglio in che senso? Più facile, più veloce, ...? –

+2

Beh, è ​​sicuro dal punto di vista del tipo, se ti preoccupi di questo genere di cose. Mi aspetto che sia più veloce anche perché XmlReader potrebbe funzionare direttamente con lo stream e non dovrebbe necessariamente caricare tutto in una stringa. –

0

Certo, c'è un System.Xml namespace:

Lo spazio dei nomi System.XML fornisce il supporto basato su standard per l'elaborazione XML.

Per utilizzarlo, tuttavia, probabilmente sarà necessario aggiungerlo come riferimento nel progetto. Microsoft ha instructions for doing this in Visual Studio.

+2

Non pertinente alla risposta. –

23

Si traduce in SqlXml ed è possibile ottenere uno XmlReader con SqlXml.CreateReader da esso. Dovresti utilizzare il metodo SqlDataReader.GetSqlXml per ottenere il tipo anziché una stringa.

Ad esempio:

 SqlDataReader reader = cmd.ExecuteReader(); 
     while (reader.Read()) 
     { 
      SqlXml xmlData = 
      reader.GetSqlXml(0); 
      XmlReader xmlReader = xmlData.CreateReader(); 

      xmlReader.MoveToContent(); 
      while (xmlReader.Read()) 
      { 
       if (xmlReader.NodeType == XmlNodeType.Element) 
       { 
        string elementName = xmlReader.LocalName; 
        xmlReader.Read(); 
        Console.WriteLine(elementName + ": " + xmlReader.Value); 
       } 
      } 
     } 

AGGIORNAMENTO: Per rispondere a un commento utile da @Wiktor Zychla

Le prestazioni di questo approccio è migliore e può essere molto meglio quando si tratta di grandi dimensioni Campi XML perché SqlReader.GetString caricherà il contenuto del campo in una stringa, mentre SqlReader.GetSqlXml crea direttamente un XmlReader dallo stream. Questo può essere rapidamente verificato con uno sguardo a System.Data in Reflector o uno strumento simile.

4

Io uso questo metodo me stesso, utilizzando SqlCommand.ExecuteXmlReader();

XmlDocument xdoc = new XmlDocument(); 
using (SqlCommand command = new SqlCommand(queryString, connection)) 
{ 
    XmlReader reader = command.ExecuteXmlReader(); 
    if (reader.Read()) 
    { 
     xdoc.Load(reader); 
    } 
} 
+4

Penso che funzionerebbe solo per "un set di risultati a riga singola, a colonna singola che contiene dati XML", per citare MSDN. –

+0

Come suppongo che la variabile 'XmlDocument' non prenda 'Xmlreader' come oggetto per la funzione Load(). –

+0

@ A CRM - lo fa ora. using (System.Xml.XmlReader xmlReader = xmlData.CreateReader()) { System.Xml.XmlDocument xd = new System.Xml.XmlDocument(); xd.Load (xmlReader); return xd; } –

Problemi correlati