對資料集執行 XPath 查詢
您可以利用同步處理 DataSet 與 XmlDataDocument 間的關聯性來使用 XML 服務,例如 XML 路徑語言 (XPath) 查詢,這些服務可存取 XmlDataDocument,且執行某些功能會比直接存取 DataSet 更方便。 例如,不需使用 DataTable 的 Select 方法在 DataSet 瀏覽與其他資料表的關聯性,而可以在與 DataSet 同步處理的 XmlDataDocument 上執行 XPath 查詢,以取得 XmlNodeList 格式的 XML 元素清單。 XmlNodeList 的節點轉換為節點 XmlElement 後,接著可以傳遞給 XmlDataDocument 的 GetRowFromElement 方法,以將相符的參考 DataRow 傳回給同步處理的 DataSet 資料表資料列。
例如,下列程式碼範例執行「孫代」XPath 查詢。 DataSet 內會填入三個資料表:Customers、Orders 與 OrderDetails。 在此樣本,先在 Customers 與 Orders 資料表間建立父代子系關聯,在 Orders 與 OrderDetails 資料表間亦同。 接著執行 XPath 查詢以傳回 Customers 節點的 XmlNodeList,其中身為下下層的 OrderDetails 節點具有值為 43 的 ProductID 節點。 就本質上而言,此樣本是使用 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]);
}
另請參閱
- 資料集和 XmlDataDocument 同步處理
- ADO.NET 概觀 \(部分機器翻譯\)