DataRelations 중첩(ADO.NET)
업데이트: November 2007
데이터의 관계형 표현에서 각 테이블에는 열이나 열 집합을 사용하여 서로 연결시키는 행이 포함되어 있습니다. ADO.NET DataSet에서 각 테이블 사이의 관계는 DataRelation을 사용하여 구현됩니다. DataRelation을 만들 때 열의 부모-자식 관계는 관계를 통해서만 관리됩니다. 테이블과 열은 별개의 엔터티입니다. XML에서 제공하는 데이터의 계층적 표현에서 부모-자식 관계는 중첩된 자식 요소를 포함하는 부모 요소에 의해 표현됩니다.
DataSet이 XmlDataDocument와 동기화되거나 WriteXml을 사용하여 XML 데이터로 작성될 때 자식 개체의 중첩을 쉽게 표현하기 위해 DataRelation은 Nested 속성을 노출합니다. DataRelation의 Nested 속성을 true로 설정하면 해당 관계의 자식 행은 XML 데이터로 작성되거나 XmlDataDocument와 동기화될 때 부모 열 내에 중첩됩니다. 기본적으로 DataRelation의 Nested 속성은 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"]);
DataRelation 개체의 Nested 속성이 이 DataSet에 대해 true로 설정되어 있지 않기 때문에 이 DataSet이 XML 데이터로 표현될 때 자식 개체가 부모 요소 내에 중첩되지 않습니다. 관련 DataSet을 포함하나 데이터 관계가 중첩되지 않은 DataSet의 XML 표현을 변환하면 성능이 느려질 수 있습니다. 데이터 관계를 중첩하는 것이 좋습니다. 이 작업을 수행하려면 Nested 속성을 true로 설정하십시오. 그런 다음 XSLT 스타일시트에서 하향 계층 구조적인 XPath 쿼리 식을 사용하여 데이터를 찾고 변환하는 코드를 작성합니다.
다음 코드 예제에서는 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의 Nested 속성을 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>