다음을 통해 공유


데이터 세트에서 XPath 쿼리 수행

동기화된 DataSetXmlDataDocument 간의 관계를 통해 XmlDataDocument에 접근하는 XML 경로 언어(XPath) 쿼리와 같은 XML 서비스를 사용할 수 있으며, 이는 DataSet에 직접 접근하는 것보다 특정 기능을 더 편리하게 수행할 수 있습니다. 예를 들어, SelectDataTable의 방법을 사용하여 DataSet에서 다른 테이블로의 관계를 탐색하는 대신, XmlDataDocumentDataSet과 동기화된 상태에서 XPath 쿼리를 수행하여 XmlNodeList 형식으로 XML 요소 목록을 가져올 수 있습니다. 그런 다음 노드로 캐스팅된 XmlElementGetRowFromElement의 노드를 XmlDataDocument의 메서드에 전달하여 동기화된 DataRow의 테이블 행에 일치하는 참조를 반환할 수 있습니다.

예를 들어 다음 코드 샘플은 "손자" XPath 쿼리를 수행합니다. 세 DataSet 개의 테이블인 Customers, OrdersOrderDetails로 채워집니다. 샘플에서 먼저 CustomersOrders 테이블 사이에, 그리고 OrdersOrderDetails 테이블 사이에 부모-자식 관계가 설정됩니다. XPath 쿼리를 수행하여, 값이 43인 ProductID 노드를 갖고 있는 손자 OrderDetails 노드가 포함된 Customers 노드를 반환합니다. 본질적으로 이 샘플은 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]);
}

참고하십시오