Navigieren in 'DataRelations' (ADO.NET)

Aktualisiert: November 2007

Eine der Hauptfunktionen einer DataRelation besteht darin, die Navigation von einer DataTable zu einer anderen innerhalb eines DataSet zu ermöglichen. Dadurch können Sie alle verknüpften DataRow-Objekte in einer DataTable abrufen, wenn eine einzelne DataRow von einer verknüpften DataTable vorliegt. Nachdem Sie z. B. eine DataRelation zwischen einer Kundentabelle und einer Auftragstabelle erstellt haben, können Sie alle Auftragszeilen für eine bestimmte Kundenzeile mit GetChildRows abrufen.

Im folgenden Codebeispiel wird eine DataRelation zwischen der Customers-Tabelle und der Orders-Tabelle eines DataSets erstellt, und es werden alle Aufträge für die einzelnen Kunden zurückgegeben.

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

Das nächste Beispiel baut auf dem vorhergehenden Beispiel auf. Hier werden vier Tabellen miteinander verknüpft, sodass über diese Beziehungen zu den Tabellen navigiert werden kann. Wie im vorhergehenden Beispiel verknüpft CustomerID die Customers-Tabelle mit der Orders-Tabelle. Für jeden Kunden in der Customers-Tabelle werden alle untergeordneten Zeilen in der Orders-Tabelle bestimmt, um die Anzahl der Aufträge eines bestimmten Kunden und die entsprechenden OrderID-Werte zurückgeben zu können.

Das erweiterte Beispiel gibt auch die Werte aus den Tabellen OrderDetails und Products zurück. Die Orders-Tabelle wird unter Verwendung von OrderID mit der OrderDetails-Tabelle verknüpft, um die bestellten Produkte und Mengen für jeden Kundenauftrag zu ermitteln. Da die OrderDetails-Tabelle nur die ProductID eines bestellten Produkts enthält, wird OrderDetails über ProductID mit Products verknüpft, um ProductName zurückzugeben. Bei dieser Beziehung ist die Products-Tabelle die übergeordnete Tabelle und die OrderDetails-Tabelle die untergeordnete Tabelle. Als Ergebnis wird beim Durchlaufen der OrderDetails-Tabelle GetParentRow aufgerufen, um den in Beziehung stehenden ProductName-Wert abzurufen.

Beachten Sie, dass beim Erstellen der DataRelation für die Tabellen Customers und Orders kein Wert für das createConstraints-Flag (der Standardwert ist True) angegeben wird. Es wird davon ausgegangen, dass alle Zeilen in der Orders-Tabelle einen CustomerID-Wert haben, der in der übergeordneten Customers-Tabelle vorhanden ist. Wenn in der Orders-Tabelle eine CustomerID vorhanden ist, die nicht in der Customers-Tabelle vorkommt, wird durch eine ForeignKeyConstraint eine Ausnahme ausgelöst.

Wenn die untergeordnete Spalte Werte enthält, die in der übergeordneten Spalte nicht enthalten sind, legen Sie beim Hinzufügen der DataRelation das createConstraints-Flag auf false fest. Im Beispiel wird False für das createConstraints-Flag der DataRelation zwischen den Tabellen Orders und OrderDetails festgelegt. Damit ist die Anwendung in der Lage, alle Datensätze aus der OrderDetails-Tabelle und nur eine Teilmenge der Datensätze aus der Orders-Tabelle zurückzugeben, ohne dass eine Laufzeitausnahme ausgelöst wird. Im erweiterten Beispiel wird die Ausgabe im folgenden Format generiert:

      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

Das folgende Codebeispiel ist erweitert. In diesem Beispiel werden die Werte aus den Tabellen OrderDetails und Products und nur eine Teilmenge der Datensätze der Orders-Tabelle zurückgegeben.

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

Siehe auch

Weitere Ressourcen

'DataSets', 'DataTables' und 'DataViews' (ADO.NET)