Een XPath-query uitvoeren op een DataSet
De relatie tussen een gesynchroniseerde DataSet en XmlDataDocument u kunt gebruikmaken van XML-services, zoals de XPath-query (XML Path Language), die toegang hebben tot xmlDataDocument en bepaalde functionaliteit handiger kunnen uitvoeren dan rechtstreeks toegang tot de DataSet. In plaats van de methode Selecteren te gebruiken om DataTable relaties met andere tabellen in een DataSet te navigeren, kunt u bijvoorbeeld een XPath-query uitvoeren op een XmlDataDocument dat is gesynchroniseerd met de DataSet, om een lijst met XML-elementen op te halen in de vorm van een XmlNodeList. De knooppunten in de XmlNodeList, casten als XmlElement knooppunten, kunnen vervolgens worden doorgegeven aan de methode GetRowFromElement van het XmlDataDocument om overeenkomende DataRow verwijzingen te retourneren naar de rijen van de tabel in de gesynchroniseerde DataSet.
Met het volgende codevoorbeeld wordt bijvoorbeeld een XPath-query 'kleinkind' uitgevoerd. De DataSet is gevuld met drie tabellen: Klanten, Orders en OrderDetails. In het voorbeeld wordt eerst een bovenliggende en onderliggende relatie gemaakt tussen de tabellen Klanten en Orders , en tussen de tabellen Orders en OrderDetails . Vervolgens wordt een XPath-query uitgevoerd om een XmlNodeList van Klanten-knooppunten te retourneren waarbij een knooppunt OrderDetails van kleinkind een ProductID-knooppunt heeft met de waarde 43. In wezen gebruikt het voorbeeld de XPath-query om te bepalen welke klanten het product met de product-id van 43 hebben besteld.
' Assumes that connection is a valid SqlConnection.
connection.Open()
Dim dataSet As DataSet = New DataSet("CustomerOrders")
Dim customerAdapter As SqlDataAdapter = New SqlDataAdapter( _
"SELECT * FROM Customers", connection)
customerAdapter.Fill(dataSet, "Customers")
Dim orderAdapter As SqlDataAdapter = New SqlDataAdapter( _
"SELECT * FROM Orders", connection)
orderAdapter.Fill(dataSet, "Orders")
Dim detailAdapter As SqlDataAdapter = New SqlDataAdapter( _
"SELECT * FROM [Order Details]", connection)
detailAdapter.Fill(dataSet, "OrderDetails")
connection.Close()
dataSet.Relations.Add("CustOrders", _
dataSet.Tables("Customers").Columns("CustomerID"), _
dataSet.Tables("Orders").Columns("CustomerID")).Nested = true
dataSet.Relations.Add("OrderDetail", _
dataSet.Tables("Orders").Columns("OrderID"), _
dataSet.Tables("OrderDetails").Columns("OrderID"), false).Nested = true
Dim xmlDoc As XmlDataDocument = New XmlDataDocument(dataSet)
Dim nodeList As XmlNodeList = xmlDoc.DocumentElement.SelectNodes( _
"descendant::Customers[*/OrderDetails/ProductID=43]")
Dim dataRow As DataRow
Dim xmlNode As XmlNode
For Each xmlNode In nodeList
dataRow = xmlDoc.GetRowFromElement(CType(xmlNode, XmlElement))
If Not dataRow Is Nothing then Console.WriteLine(xmlRow(0).ToString())
Next
// Assumes that connection is a valid SqlConnection.
connection.Open();
DataSet dataSet = new DataSet("CustomerOrders");
SqlDataAdapter customerAdapter = new SqlDataAdapter(
"SELECT * FROM Customers", connection);
customerAdapter.Fill(dataSet, "Customers");
SqlDataAdapter orderAdapter = new SqlDataAdapter(
"SELECT * FROM Orders", connection);
orderAdapter.Fill(dataSet, "Orders");
SqlDataAdapter detailAdapter = new SqlDataAdapter(
"SELECT * FROM [Order Details]", connection);
detailAdapter.Fill(dataSet, "OrderDetails");
connection.Close();
dataSet.Relations.Add("CustOrders",
dataSet.Tables["Customers"].Columns["CustomerID"],
dataSet.Tables["Orders"].Columns["CustomerID"]).Nested = true;
dataSet.Relations.Add("OrderDetail",
dataSet.Tables["Orders"].Columns["OrderID"],
dataSet.Tables["OrderDetails"].Columns["OrderID"],
false).Nested = true;
XmlDataDocument xmlDoc = new XmlDataDocument(dataSet);
XmlNodeList nodeList = xmlDoc.DocumentElement.SelectNodes(
"descendant::Customers[*/OrderDetails/ProductID=43]");
DataRow dataRow;
foreach (XmlNode xmlNode in nodeList)
{
dataRow = xmlDoc.GetRowFromElement((XmlElement)xmlNode);
if (dataRow != null)
Console.WriteLine(dataRow[0]);
}