Navigieren in "DataRelations"

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 Tabelle Customers und der Tabelle Orders eines DataSets erstellt, und es werden alle Aufträge für die einzelnen Kunden zurückgegeben.

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

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 Tabelle Customers mit der Tabelle Orders. Für jeden Kunden in der Tabelle Customers werden alle untergeordneten Zeilen in der Tabelle Orders 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 Tabelle Orders wird unter Verwendung von OrderID mit der Tabelle OrderDetails verknüpft, um die bestellten Produkte und Mengen für jeden Kundenauftrag zu ermitteln. Da die Tabelle OrderDetails 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 Tabelle Products die übergeordnete Tabelle und die Tabelle OrderDetails die untergeordnete Tabelle. Als Ergebnis wird GetParentRow beim Durchlaufen der Tabelle OrderDetails 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 Flag createConstraints (der Standardwert ist true) angegeben wird. Es wird davon ausgegangen, dass alle Zeilen in der Tabelle Orders einen CustomerID-Wert haben, der in der übergeordneten Tabelle Customers vorhanden ist. Wenn in der Tabelle Orders eine CustomerID vorhanden ist, die nicht in der Tabelle Customers vorkommt, wird durch 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 Flag createConstraints auf false fest. Im Beispiel wird false für das Flag createConstraints der DataRelation zwischen den Tabellen Orders und OrderDetails festgelegt. Damit ist die Anwendung in der Lage, alle Datensätze aus der Tabelle OrderDetails und nur eine Teilmenge der Datensätze aus der Tabelle Orders 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 Tabelle Orders zurückgegeben.

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

Siehe auch