Навигация в DataRelations (ADO.NET)

Обновлен: November 2007

Одно из основных назначений объекта DataRelation состоит в обеспечении переходов от одного объекта DataTable к другому в пределах DataSet. Это позволяет получать все связанные объекты DataRow в одном объекте DataTable при указании единственного значения DataRow из связанного объекта DataTable. Например, после установления связи DataRelation между таблицей заказчиков и таблицей заказов можно получить все строки с заказами для конкретной строки заказчика с помощью метода GetChildRows.

В следующем примере кода создается связь DataRelation между таблицей Customers и таблицей Orders набора данных DataSet и возвращаются все заказы для каждого заказчика.

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
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());
    }
}

Следующий пример основан на предыдущем примере; в нем четыре таблицы связываются друг с другом и происходит переход по этим связям. Как и в предыдущем примере, значение CustomerID связывает таблицу Customers с таблицей Orders. Для каждого заказчика в таблице Customers определяются все дочерние строки в таблице Orders для получения данных о количестве заказов конкретного заказчика и значений OrderID этих заказов.

В расширенном примере также осуществляется возврат значений из таблиц OrderDetails и Products. Между таблицей Orders и таблицей OrderDetails с помощью значений OrderID устанавливается связь, позволяющая определить для каждого клиентского заказа, какие продукты были заказаны и в каком количестве. Таблица OrderDetails содержит только значение ProductID каждого заказанного продукта, поэтому для возврата значений ProductName устанавливается связь таблицы OrderDetails с таблицей Products с помощью значений ProductID. В этой связи таблица Products является родительской, а таблица OrderDetails — дочерней. В результате этого при выполнении итераций по строкам таблицы OrderDetails вызывается метод GetParentRow для получения связанного значения ProductName.

Обратите внимание на то, что при создании связи DataRelation для таблиц Customers и Orders значение для флага createConstraints не задается (значение по умолчанию равно true). При этом предполагается, что все строки в таблице Orders имеют значение CustomerID, которое существует в родительской таблице Customers. Если одно из значений CustomerID, существующих в таблице Orders, не существует в таблице Customers, то объект ForeignKeyConstraint вызывает исключение.

Если дочерний столбец может содержать значения, которые не содержатся в родительском столбце, задайте значение флага createConstraints, равное false, при добавлении связи DataRelation. В этом примере флаг createConstraints устанавливается в значение false для связи DataRelation между таблицей Orders и таблицей OrderDetails. Это позволяет возвращать в приложении все записи из таблицы 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

Следующий пример кода представляет собой расширенный образец, в котором возвращаются значения из таблиц OrderDetails и Products, причем возвращается только подмножество записей из таблицы Orders.

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
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"]);
        }
    }
}

См. также

Другие ресурсы

Объекты DataSet, DataTable и DataView (ADO.NET)