Freigeben über


SQL-XML-Spaltenwerte (ADO.NET)

Aktualisiert: November 2007

SQL Server 2005 unterstützt den neuen xml-Datentyp. Daher können Entwickler Resultsets, die diesen Typ einschließen, mithilfe des Standardverhaltens der SqlCommand-Klasse abrufen. Eine xml-Spalte kann auf die gleiche Weise abgerufen werden wie jede andere Spalte auch (z. B. in einem SqlDataReader). Wenn Sie jedoch mit dem Inhalt der Spalte in Form von XML-Daten arbeiten möchten, müssen Sie einen XmlReader verwenden.

Beispiel

Die folgende Konsolenanwendung ruft zwei Zeilen mit jeweils einer xml-Spalte aus der Sales.Store-Tabelle in der AdventureWorks-Datenbank ab und übermittelt sie an eine SqlDataReader-Instanz. Der Wert der xml-Spalte für jede Zeile wird mit der GetSqlXml-Methode des SqlDataReader gelesen. Der Wert wird in einem XmlReader gespeichert. Wenn Sie den Inhalt als SqlXml-Variable festlegen möchten, müssen Sie anstelle der GetValue-Methode die GetSqlXml-Methode verwenden, denn GetValue gibt den Wert der xml-Spalte als Zeichenfolge zurück.

Hinweis:

Beim Installieren von SQL Server 2005 wird die Beispieldatenbank AdventureWorks in der Standardeinstellung nicht installiert. Sie kann jedoch durch Ausführen des Setups von SQL Server installiert werden.

' Example assumes the following directives:
'    Imports System.Data.SqlClient
'    Imports System.Xml
'    Imports System.Data.SqlTypes

Private Sub GetXmlData(ByVal connectionString As String)
    Using connection As SqlConnection = New SqlConnection(connectionString)
        connection.Open()

        'The query includes two specific customers for simplicity's 
        'sake. A more realistic approach would use a parameter
        'for the CustomerID criteria. The example selects two rows
        'in order to demonstrate reading first from one row to 
        'another, then from one node to another within the xml
        'column.
        Dim commandText As String = _
         "SELECT Demographics from Sales.Store WHERE " & _
         "CustomerID = 3 OR CustomerID = 4"

        Dim commandSales As New SqlCommand(commandText, connection)

        Dim salesReaderData As SqlDataReader = commandSales.ExecuteReader()

        ' Multiple rows are returned by the SELECT, so each row
        ' is read and an XmlReader (an xml data type) is set to the 
        ' value of its first (and only) column.
        Dim countRow As Integer = 1
        While salesReaderData.Read()
            ' Must use GetSqlXml here to get a SqlXml type. 
            ' GetValue returns a string instead of SqlXml.
            Dim salesXML As SqlXml = _
             salesReaderData.GetSqlXml(0)
            Dim salesReaderXml As XmlReader = salesXML.CreateReader()

            Console.WriteLine("-----Row " & countRow & "-----")

            ' Move to the root.
            salesReaderXml.MoveToContent()

            ' We know each node type is either Element or Text.
            ' All elements within the root are string values. 
            ' For this simple example, no elements
            ' are empty.
            While salesReaderXml.Read()
                If salesReaderXml.NodeType = XmlNodeType.Element Then
                    Dim elementLocalName As String = _
                     salesReaderXml.LocalName
                    salesReaderXml.Read()
                    Console.WriteLine(elementLocalName & ": " & _
                     salesReaderXml.Value)
                End If
            End While
            countRow = countRow + 1
        End While
    End Using
End Sub
// Example assumes the following directives:
//     using System.Data.SqlClient;
//     using System.Xml;
//     using System.Data.SqlTypes;

static void GetXmlData(string connectionString)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();

        // The query includes two specific customers for simplicity's 
        // sake. A more realistic approach would use a parameter
        // for the CustomerID criteria. The example selects two rows
        // in order to demonstrate reading first from one row to 
        // another, then from one node to another within the xml column.
        string commandText =
            "SELECT Demographics from Sales.Store WHERE " +
            "CustomerID = 3 OR CustomerID = 4";

        SqlCommand commandSales = new SqlCommand(commandText, connection);

        SqlDataReader salesReaderData = commandSales.ExecuteReader();

        //  Multiple rows are returned by the SELECT, so each row
        //  is read and an XmlReader (an xml data type) is set to the 
        //  value of its first (and only) column. 
        int countRow = 1;
        while (salesReaderData.Read())
        //  Must use GetSqlXml here to get a SqlXml type. 
        //  GetValue returns a string instead of SqlXml. 
        {
            SqlXml salesXML =
                salesReaderData.GetSqlXml(0);
            XmlReader salesReaderXml = salesXML.CreateReader();
            Console.WriteLine("-----Row " + countRow + "-----");

            //  Move to the root. 
            salesReaderXml.MoveToContent();

            //  We know each node type is either Element or Text.
            //  All elements within the root are string values. 
            //  For this simple example, no elements are empty. 
            while (salesReaderXml.Read())
            {
                if (salesReaderXml.NodeType == XmlNodeType.Element)
                {
                    string elementLocalName =
                        salesReaderXml.LocalName;
                    salesReaderXml.Read();
                    Console.WriteLine(elementLocalName + ": " +
                        salesReaderXml.Value);
                }
            }
            countRow = countRow + 1;
        }
    }
}

Siehe auch

Konzepte

XML-Daten in SQL Server (ADO.NET)

Referenz

SqlXml