共用方式為


在數據集上執行 XPath 查詢

同步的DataSetXmlDataDocument之間的關係允許你使用 XML 服務,例如 XML 路徑語言(XPath)查詢,這些服務能夠訪問XmlDataDocument,並能比直接訪問DataSet更方便地執行某些功能。 例如,與其使用 Select 方法來導航 DataTableDataSet 中其他資料表的關係,不如對與 XmlDataDocument 同步的 物件進行 XPath 查詢,以取得 XML 元素清單,該清單將以 XmlNodeList 的形式顯示。 XmlNodeList 中的節點可以被轉型為 XmlElement 節點,然後傳遞到 XmlDataDocumentGetRowFromElement 方法,以回傳在同步的 DataSet 中資料表的列所對應的DataRow

例如,下列程式代碼範例會執行 「grandchild」 XPath 查詢。 裡面 DataSet 有三個表格: CustomersOrdersOrderDetails。 在範例中,首先在Customers表和Orders表之間,Orders表和OrderDetails表之間建立父子關係。 接著執行 XPath 查詢,回傳XmlNodeListCustomers一個節點,其中一個孫OrderDetails節點的ProductID節點值為 43。 本質上,這個範例使用 XPath 查詢來判斷哪些顧客訂購了具有代碼為 ProductID 的產品,代碼為 43。

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

另請參閱