동기화된 DataSet 관계와 XmlDataDocument XPath(XML Path Language) 쿼리와 같은 XML 서비스를 사용하여 XmlDataDocument 에 액세스하고 DataSet 에 직접 액세스하는 것보다 더 편리하게 특정 기능을 수행할 수 있습니다. 예를 들어 DataSet의 DataTable 다른 테이블로의 관계를 탐색하기 위해 Select 메서드를 사용하는 대신 DataSet과 동기화되는 XmlDataDocument에서 XPath 쿼리를 수행하여 XML 요소의 목록을 XmlNodeList가져올 수 있습니다. 그런 다음 노드로 캐스팅된 XmlElement의 노드를 XmlDataDocument의 GetRowFromElement 메서드에 전달하여 동기화된 DataRow의 테이블 행에 일치하는 참조를 반환할 수 있습니다.
예를 들어 다음 코드 샘플은 "손자" XPath 쿼리를 수행합니다. DataSet은 고객, 주문 및 OrderDetails의 세 개의 테이블로 채워집니다. 샘플에서 부모-자식 관계는 먼저 Customers 테이블과 Orders 테이블과 OrderDetails 테이블 간에 만들어 집니다. 그런 다음 XPath 쿼리를 수행하여 손자 OrderDetails 노드에 값이 43인 ProductID 노드가 있는 고객 노드의 XmlNodeList를 반환합니다. 본질적으로 샘플은 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]);
}