2012-12-03 1 views
14

Wir haben eine Spalte in der Datenbank, die den Typ xml hat. Ich lese diese Informationen über die .net SqlDataReader, aber ich bin mir nicht sicher, um was es zu werfen ist.Was übersetzt der SQL Server XML-Datentyp in .NET und wie wandere ich ihn in XmlDocument um?

Die Msdn Tabelle (http://msdn.microsoft.com/en-us/library/cc716729.aspx) schlägt vor, dass der Xml .net-Typ ist, aber es gibt keine System.Xml, nur System.Web.UI.WebControls.Xml so sicher, dass ich nicht, ob das richtig ist. diese

So ist meine Frage:

Was tun warf ich die SqlDbType.Xml als ich es von einem SqlDataReader lesen, und wie kann ich umwandeln, das zu XmlDocument?

+0

verwenden Sie SqlConnection oder Entity? –

+0

ich benutze sqlconnection – Sinaesthetic

Antwort

5

Ich erinnere mich, es zu einer Schnur zu werfen. Füttern XmlDocument mit einer Zeichenfolge funktioniert dann wie gewohnt.

+3

Während das funktioniert, denke ich, dass es besser ist, stattdessen mit dem nativen Typ zu arbeiten. –

+0

Was rechtfertigt dieses Urteil? Besser in welchem ​​Sinne? Einfacher, schneller, ...? –

+2

Nun, es ist typsicher, wenn man sich für solche Dinge interessiert. Ich würde erwarten, dass es auch schneller geht, weil der XmlReader direkt mit dem Stream arbeiten könnte und nicht unbedingt zuerst alles in eine Zeichenkette laden müsste. –

0

Sicher, es gibt ein System.Xml namespace:

System.XML Namespace bietet standardbasierte Unterstützung für die Verarbeitung von XML.

Um es jedoch zu verwenden, müssen Sie es wahrscheinlich als Referenz in Ihrem Projekt hinzufügen. Microsoft hat instructions for doing this in Visual Studio.

+2

Nicht relevant für die Antwort. –

23

Es übersetzt in SqlXml und Sie können eine XmlReader mit SqlXml.CreateReader daraus erhalten. Sie müssten SqlDataReader.GetSqlXml Methode verwenden, um den Typ anstelle einer Zeichenfolge abzurufen.

Zum Beispiel:

 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); 
       } 
      } 
     } 

UPDATE: Um einen hilfreichen Kommentar von @Wiktor Zychla zu beantworten

Die Leistung dieses Ansatzes besser ist und eine Menge sein kann besser, wenn mit großem Umgang XML-Felder, weil SqlReader.GetString den Feldinhalt zuerst in eine Zeichenfolge lädt, während SqlReader.GetSqlXml einen XmlReader direkt aus dem Stream erstellt. Dies kann schnell mit einem Blick auf System.Data in Reflector oder einem ähnlichen Tool überprüft werden.

4

ich diese Methode selbst verwenden, mit SqlCommand.ExecuteXmlReader();

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

Ich denke, das würde nur funktionieren für "eine einreihige, einspaltige Ergebnismenge, die XML-Daten enthält", um MSDN zu zitieren. –

+0

Wie ich rate 'XmlDocument' Variable nicht 'Xmlreader' als ein Objekt für die Funktion Load(). –

+0

@A CRM - es tut jetzt. Verwenden (System.Xml.XmlReader xmlReader = xmlData.CreateReader()) { System.Xml.XmlDocument xd = neu System.Xml.XmlDocument(); xd.Load (xmlReader); Rückkehr xd; } –