다음을 통해 공유


DataRelations 중첩하기

데이터의 관계형 표현에서 개별 테이블에는 열 또는 열 집합을 사용하여 서로 관련된 행이 포함됩니다. ADO.NET DataSet테이블 간의 관계는 을 사용하여 DataRelation구현됩니다. DataRelation을 만들 때 열의 부모-자식 관계는 관계를 통해서만 관리됩니다. 테이블과 열은 별도의 개체입니다. XML에서 제공하는 데이터의 계층적 표현에서 부모-자식 관계는 중첩된 자식 요소를 포함하는 부모 요소로 표시됩니다.

DataSetXmlDataDocument와 동기화되거나 WriteXml을 사용하여 XML 데이터로 기록될 때, 자식 개체의 중첩을 용이하게 하기 위해 DataRelation은 Nested 속성을 노출합니다. DataRelation중첩 속성을 true로 설정하면 XML 데이터로 작성되거나 XmlDataDocument와 동기화될 때 관계의 자식 행이 부모 열 내에 중첩됩니다. Nested 속성의 DataRelation은 기본적으로 false입니다.

예를 들어 다음 DataSet을 고려합니다.

' Assumes connection is a valid SqlConnection.  
Dim customerAdapter As SqlDataAdapter = New SqlDataAdapter( _  
  "SELECT CustomerID, CompanyName FROM Customers", connection)  
Dim orderAdapter As SqlDataAdapter = New SqlDataAdapter( _  
  "SELECT OrderID, CustomerID, OrderDate FROM Orders", connection)  
  
connection.Open()  
  
Dim dataSet As DataSet = New DataSet("CustomerOrders")  
customerAdapter.Fill(dataSet, "Customers")  
orderAdapter.Fill(dataSet, "Orders")  
  
connection.Close()  
  
Dim customerOrders As DataRelation = dataSet.Relations.Add( _  
  "CustOrders", dataSet.Tables("Customers").Columns("CustomerID"), _  
  dataSet.Tables("Orders").Columns("CustomerID"))  
// Assumes connection is a valid SqlConnection.  
SqlDataAdapter customerAdapter = new SqlDataAdapter(  
  "SELECT CustomerID, CompanyName FROM Customers", connection);  
SqlDataAdapter orderAdapter = new SqlDataAdapter(  
  "SELECT OrderID, CustomerID, OrderDate FROM Orders", connection);  
  
connection.Open();  
  
DataSet dataSet = new DataSet("CustomerOrders");  
customerAdapter.Fill(dataSet, "Customers");  
orderAdapter.Fill(dataSet, "Orders");  
  
connection.Close();  
  
DataRelation customerOrders = dataSet.Relations.Add(  
  "CustOrders", dataSet.Tables["Customers"].Columns["CustomerID"],  
  dataSet.Tables["Orders"].Columns["CustomerID"]);  

DataSet에 대해 DataRelation 개체의 Nested 속성이 true로 설정되지 않았으므로 이 DataSet이 XML 데이터로 표현될 때 자식 개체는 부모 요소 내에 중첩되지 않습니다. 중첩되지 않은 데이터 관계가 있는 관련 DataSet 이 포함된 DataSet의 XML 표현을 변환하면 성능이 저하될 수 있습니다. 데이터 관계를 중첩하는 것이 좋습니다. 이렇게 하려면 중첩된 속성을 true로 설정합니다. 그런 다음, 하향식 계층적 XPath 쿼리 식을 사용하여 데이터를 찾고 변환하는 코드를 XSLT 스타일시트에 작성합니다.

다음 코드 예제에서는 DataSet에서 WriteXml을 호출한 결과를 보여 줍니다.

<CustomerOrders>  
  <Customers>  
    <CustomerID>ALFKI</CustomerID>  
    <CompanyName>Alfreds Futterkiste</CompanyName>  
  </Customers>  
  <Customers>  
    <CustomerID>ANATR</CustomerID>  
    <CompanyName>Ana Trujillo Emparedados y helados</CompanyName>  
  </Customers>  
  <Orders>  
    <OrderID>10643</OrderID>  
    <CustomerID>ALFKI</CustomerID>  
    <OrderDate>1997-08-25T00:00:00</OrderDate>  
  </Orders>  
  <Orders>  
    <OrderID>10692</OrderID>  
    <CustomerID>ALFKI</CustomerID>  
    <OrderDate>1997-10-03T00:00:00</OrderDate>  
  </Orders>  
  <Orders>  
    <OrderID>10308</OrderID>  
    <CustomerID>ANATR</CustomerID>  
    <OrderDate>1996-09-18T00:00:00</OrderDate>  
  </Orders>  
</CustomerOrders>  

Customers 요소와 Orders 요소는 형제 요소로 표시됩니다. Orders 요소가 해당 부모 요소의 자식 요소로 표시되도록 하려면 DataRelation중첩 속성을 true로 설정해야 하며 다음을 추가합니다.

customerOrders.Nested = True  
customerOrders.Nested = true;  

다음 코드에서는 Orders 요소가 해당 부모 요소 내에 중첩된 결과 출력의 모양을 보여 줍니다.

<CustomerOrders>  
  <Customers>  
    <CustomerID>ALFKI</CustomerID>  
    <Orders>  
      <OrderID>10643</OrderID>  
      <CustomerID>ALFKI</CustomerID>  
      <OrderDate>1997-08-25T00:00:00</OrderDate>  
    </Orders>  
    <Orders>  
      <OrderID>10692</OrderID>  
      <CustomerID>ALFKI</CustomerID>  
      <OrderDate>1997-10-03T00:00:00</OrderDate>  
    </Orders>  
    <CompanyName>Alfreds Futterkiste</CompanyName>  
  </Customers>  
  <Customers>  
    <CustomerID>ANATR</CustomerID>  
    <Orders>  
      <OrderID>10308</OrderID>  
      <CustomerID>ANATR</CustomerID>  
      <OrderDate>1996-09-18T00:00:00</OrderDate>  
    </Orders>  
    <CompanyName>Ana Trujillo Emparedados y helados</CompanyName>  
  </Customers>  
</CustomerOrders>  

참고하십시오