Freigeben über


Durchführen einer XPath-Abfrage für ein DataSet

Die Beziehung zwischen einem synchronisierten DataSet und einem XmlDataDocument stellt XML-Dienste bereit, wie z. B. die XPath-Abfrage, die auf das XmlDataDocument zugreifen und bestimmte Funktionen komfortabler ausführen können als dies bei einem direkten Zugriff auf das DataSet der Fall ist. Anstatt z. B. die Select-Methode einer DataTable zu verwenden, um über Beziehungen zu anderen Tabellen in einem DataSet zu navigieren, können Sie eine XPath-Abfrage für ein mit dem DataSet synchronisiertes XmlDataDocument durchführen, um eine Liste mit XML-Elementen als XmlNodeList abzurufen. Die Knoten in der XmlNodeList, die in XmlElement-Knoten umgewandelt wurden, können anschließend an die GetRowFromElement-Methode des XmlDataDocuments übergeben werden, um übereinstimmende DataRow-Verweise auf die Tabellenzeilen des synchronisierten DataSets zurückzugeben.

Im folgenden Codebeispiel wird eine "Enkel"-XPath-Abfrage ausgeführt. Das DataSet wird mit drei Tabellen gefüllt: Customers, Orders und OrderDetails. Im Beispiel wird zunächst für die Tabellen Customers und Orders und für die Tabellen Orders und OrderDetails eine hierarchische Beziehung erstellt, d. h. die Tabellen sind einander über- bzw. untergeordnet. Anschließend wird eine XPath-Abfrage ausgeführt, um eine XmlNodeList mit Customers-Knoten zurückzugeben, deren OrderDetails-Enkelknoten einen ProductID-Knoten mit dem Wert 43 besitzt. In diesem Beispiel wird nichts anderes gemacht als mit Hilfe der XPath-Abfrage die Kunden zu ermitteln, die das Produkt mit der ProductID 43 bestellt haben.

Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Xml

Public Class Sample
  Public Shared Sub Main()
    Dim nwindConn As SqlConnection = New SqlConnection("Data Source=localhost;Initial Catalog=northwind;Integrated Security=SSPI")
    nwindConn.Open()

    Dim myDataSet As DataSet = New DataSet("CustomerOrders")

    Dim custDA As SqlDataAdapter = New SqlDataAdapter("SELECT * FROM Customers", nwindConn)
    custDA.Fill(myDataSet, "Customers")

    Dim ordersDA As SqlDataAdapter = New SqlDataAdapter("SELECT * FROM Orders", nwindConn)
    ordersDA.Fill(myDataSet, "Orders")

    Dim detailsDA As SqlDataAdapter = New SqlDataAdapter("SELECT * FROM [Order Details]", nwindConn)
    detailsDA.Fill(myDataSet, "OrderDetails")

    nwindConn.Close()

    myDataSet.Relations.Add("CustOrders", _
                            myDataSet.Tables("Customers").Columns("CustomerID"), _
                            myDataSet.Tables("Orders").Columns("CustomerID")).Nested = true

    myDataSet.Relations.Add("OrderDetail", _
                            myDataSet.Tables("Orders").Columns("OrderID"), _
                            myDataSet.Tables("OrderDetails").Columns("OrderID"), false).Nested = true

    Dim xmlDoc As XmlDataDocument = New XmlDataDocument(myDataSet) 
      
    Dim nodeList As XmlNodeList = xmlDoc.DocumentElement.SelectNodes("descendant::Customers[*/OrderDetails/ProductID=43]")
      
    Dim myRow As DataRow
    Dim myNode As XmlNode

    For Each myNode In nodeList
      myRow = xmlDoc.GetRowFromElement(CType(myNode, XmlElement))

      If Not myRow Is Nothing then Console.WriteLine(myRow(0).ToString())
    Next
  End Sub
End Class
[C#]
using System;
using System.Data;
using System.Data.SqlClient;
using System.Xml;

public class Sample
{
  public static void Main()
  {
    SqlConnection nwindConn = new SqlConnection("Data Source=localhost;Initial Catalog=northwind;Integrated Security=SSPI;");
    nwindConn.Open();

    DataSet myDataSet = new DataSet("CustomerOrders");

    SqlDataAdapter custDA = new SqlDataAdapter("SELECT * FROM Customers", nwindConn);
    custDA.Fill(myDataSet, "Customers");

    SqlDataAdapter ordersDA = new SqlDataAdapter("SELECT * FROM Orders", nwindConn);
    ordersDA.Fill(myDataSet, "Orders");

    SqlDataAdapter detailsDA = new SqlDataAdapter("SELECT * FROM [Order Details]", nwindConn);
    detailsDA.Fill(myDataSet, "OrderDetails");

    nwindConn.Close();

    myDataSet.Relations.Add("CustOrders",
                         myDataSet.Tables["Customers"].Columns["CustomerID"],
                         myDataSet.Tables["Orders"].Columns["CustomerID"]).Nested = true;

    myDataSet.Relations.Add("OrderDetail",
                         myDataSet.Tables["Orders"].Columns["OrderID"],
                         myDataSet.Tables["OrderDetails"].Columns["OrderID"], false).Nested = true;

    XmlDataDocument xmlDoc = new XmlDataDocument(myDataSet); 
      
    XmlNodeList nodeList = xmlDoc.DocumentElement.SelectNodes("descendant::Customers[*/OrderDetails/ProductID=43]");
      
    DataRow myRow;
    foreach (XmlNode myNode in nodeList)
    {
      myRow = xmlDoc.GetRowFromElement((XmlElement)myNode);
      if (myRow != null)
        Console.WriteLine(myRow[0]);
    }
  }
}

Siehe auch

Synchronisieren eines DataSets mit einem XmlDataDocument