다음을 통해 공유


데이터 관계 탐색

DataRelation의 주요 기능 중 하나는 DataTable 내에서 한 DataSet에서 다른 DataSet로 탐색할 수 있게 하는 것입니다. 단일 DataRow가 제공되면 관련된 DataTable에서 모든 관련된 DataRow 개체를 하나의 에서 검색할 수 있습니다. 예를 들어 고객 테이블과 주문 테이블 사이에 설정된 DataRelationGetChildRows를 사용하여 특정 고객 행에 대한 모든 주문 행을 검색할 수 있습니다.

다음 코드 예제에서는 DataRelation 테이블과 Customers 테이블 사이에 Orders 연결을 생성하고, DataSet 안에 있는 모든 고객의 주문을 반환합니다.

DataRelation customerOrdersRelation =
    customerOrders.Relations.Add("CustOrders",
    customerOrders.Tables["Customers"].Columns["CustomerID"],
    customerOrders.Tables["Orders"].Columns["CustomerID"]);

foreach (DataRow custRow in customerOrders.Tables["Customers"].Rows)
{
    Console.WriteLine(custRow["CustomerID"].ToString());

    foreach (DataRow orderRow in custRow.GetChildRows(customerOrdersRelation))
    {
        Console.WriteLine(orderRow["OrderID"].ToString());
    }
}
Dim customerOrdersRelation As DataRelation = _
   customerOrders.Relations.Add("CustOrders", _
   customerOrders.Tables("Customers").Columns("CustomerID"), _
   customerOrders.Tables("Orders").Columns("CustomerID"))

Dim custRow, orderRow As DataRow

For Each custRow In customerOrders.Tables("Customers").Rows
    Console.WriteLine("Customer ID:" & custRow("CustomerID").ToString())

    For Each orderRow In custRow.GetChildRows(customerOrdersRelation)
        Console.WriteLine(orderRow("OrderID").ToString())
    Next
Next

다음 예제에서는 앞의 예제를 기반으로 4개의 테이블을 함께 연결하고 이러한 관계를 탐색합니다. 이전 예에서와 같이, CustomerIDCustomers 테이블을 Orders 테이블과 연결합니다. 각 고객마다 Customers 테이블에서, 특정 고객이 가진 주문 수와 Orders 값을 반환하기 위해, OrderID 테이블의 모든 자식 행이 결정됩니다.

확장된 예제는 OrderDetailsProducts 테이블의 값도 반환합니다. Orders 테이블은 각 고객 주문에 대해 어떤 제품과 수량이 주문되었는지를 결정하기 위해 OrderDetails를 사용하여 OrderID 테이블과 연결되어 있습니다. OrderDetails 테이블에는 주문된 제품의 ProductID만 포함되므로, OrderDetailsProducts의 관계를 통해 ProductIDOrderDetails을 반환합니다. 이 관계로 테이블은 Products 부모 테이블이고 Order Details 테이블은 자식입니다. 결과적으로 OrderDetails 테이블을 반복할 때, 관련된 GetParentRow 값을 검색하기 위해 ProductName이(가) 호출됩니다.

DataRelationCustomers 테이블이 생성될 때, Orders 플래그에 대한 값이 지정되지 않습니다(기본값은 createConstraints입니다). 테이블의 모든 행에는 상위 Orders 테이블에 존재하는 CustomerID 값이 있다고 가정합니다. CustomerIDOrders 테이블에 존재하지만 Customers 테이블에 존재하지 않는 경우, ForeignKeyConstraint는 예외를 발생시킵니다.

자식 열에 부모 열에 포함되지 않은 값이 포함될 수 있는 경우 createConstraintsfalse 추가할 때 플래그를 설정합니다. 예제에서는 createConstraints 테이블과 false 테이블 사이의 관계에서 DataRelation을(를) Orders 플래그로 설정합니다. 이렇게 하면 애플리케이션이 OrderDetails 런타임 예외를 생성하지 않고 테이블의 모든 레코드와 테이블의 레코드 Orders 하위 집합만 반환할 수 있습니다. 확장된 샘플은 다음 형식으로 출력을 생성합니다.

Customer ID: NORTS
  Order ID: 10517
        Order Date: 4/24/1997 12:00:00 AM
           Product: Filo Mix
          Quantity: 6
           Product: Raclette Courdavault
          Quantity: 4
           Product: Outback Lager
          Quantity: 6
  Order ID: 11057
        Order Date: 4/29/1998 12:00:00 AM
           Product: Outback Lager
          Quantity: 3

다음 코드 예제는 OrderDetailsProducts 테이블에서 값을 반환하고 Orders 테이블에서는 하위 기록의 일부만 반환하는 확장된 샘플입니다.

DataRelation customerOrdersRelation =
    customerOrders.Relations.Add("CustOrders",
    customerOrders.Tables["Customers"].Columns["CustomerID"],
    customerOrders.Tables["Orders"].Columns["CustomerID"]);

DataRelation orderDetailRelation =
    customerOrders.Relations.Add("OrderDetail",
    customerOrders.Tables["Orders"].Columns["OrderID"],
    customerOrders.Tables["OrderDetails"].Columns["OrderID"], false);

DataRelation orderProductRelation =
    customerOrders.Relations.Add("OrderProducts",
    customerOrders.Tables["Products"].Columns["ProductID"],
    customerOrders.Tables["OrderDetails"].Columns["ProductID"]);

foreach (DataRow custRow in customerOrders.Tables["Customers"].Rows)
{
    Console.WriteLine("Customer ID: " + custRow["CustomerID"]);

    foreach (DataRow orderRow in custRow.GetChildRows(customerOrdersRelation))
    {
        Console.WriteLine("  Order ID: " + orderRow["OrderID"]);
        Console.WriteLine("\tOrder Date: " + orderRow["OrderDate"]);

        foreach (DataRow detailRow in orderRow.GetChildRows(orderDetailRelation))
        {
            Console.WriteLine("\t Product: " +
                detailRow.GetParentRow(orderProductRelation)["ProductName"]);
            Console.WriteLine("\t Quantity: " + detailRow["Quantity"]);
        }
    }
}
Dim customerOrdersRelation As DataRelation = _
   customerOrders.Relations.Add("CustOrders", _
   customerOrders.Tables("Customers").Columns("CustomerID"), _
   customerOrders.Tables("Orders").Columns("CustomerID"))

Dim orderDetailRelation As DataRelation = _
   customerOrders.Relations.Add("OrderDetail", _
   customerOrders.Tables("Orders").Columns("OrderID"), _
   customerOrders.Tables("OrderDetails").Columns("OrderID"), False)

Dim orderProductRelation As DataRelation = _
   customerOrders.Relations.Add("OrderProducts", _
   customerOrders.Tables("Products").Columns("ProductID"), _
   customerOrders.Tables("OrderDetails").Columns("ProductID"))

Dim custRow, orderRow, detailRow As DataRow

For Each custRow In customerOrders.Tables("Customers").Rows
    Console.WriteLine("Customer ID:" & custRow("CustomerID").ToString())

    For Each orderRow In custRow.GetChildRows(customerOrdersRelation)
        Console.WriteLine("  Order ID: " & orderRow("OrderID").ToString())
        Console.WriteLine(vbTab & "Order Date: " & _
          orderRow("OrderDate").ToString())

        For Each detailRow In orderRow.GetChildRows(orderDetailRelation)
            Console.WriteLine(vbTab & "   Product: " & _
              detailRow.GetParentRow(orderProductRelation) _
              ("ProductName").ToString())
            Console.WriteLine(vbTab & "  Quantity: " & _
              detailRow("Quantity").ToString())
        Next
    Next
Next

참고하십시오