Freigeben über


Navigieren in einer Beziehung zwischen Tabellen

Eine der Hauptfunktionen einer DataRelation besteht darin, die Navigation von einer DataTable zu einer anderen innerhalb eines DataSets zu ermöglichen. Dadurch können Sie alle zugehörigen DataRow-Objekte in einer DataTable abrufen, wenn eine einzelne DataRow einer verknüpften DataTable vorhanden ist. 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 DataRow.GetChildRows abrufen.

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

Dim custOrderRel As DataRelation = custDS.Relations.Add("CustOrders", _
                     custDS.Tables("Customers").Columns("CustomerID"), _
                     custDS.Tables("Orders").Columns("CustomerID")) 

Dim custRow As DataRow
Dim orderRow As DataRow

For Each custRow in custDS.Tables("Customers").Rows
  Console.WriteLine(custRow("CustomerID"))
  For Each orderRow in custRow.GetChildRows(custOrderRel)
    Console.WriteLine(orderRow("OrderID"))
  Next
Next
[C#]
DataRelation custOrderRel = custDS.Relations.Add("CustOrders",
                     custDS.Tables["Customers"].Columns["CustomerID"],
                     custDS.Tables["Orders"].Columns["CustomerID"]);
foreach (DataRow custRow in custDS.Tables["Customers"].Rows)
{
  Console.WriteLine(custRow["CustomerID"]);
  foreach (DataRow orderRow in custRow.GetChildRows(custOrderRel))
    Console.WriteLine(orderRow["OrderID"]);
}

Das nächste Beispiel baut auf dem vorhergehenden Beispiel auf. Hier werden vier Tabellen miteinander verknüpft, so dass ü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 unter Verwendung von ProductID mit Products verknüpft, um ProductName zurückgeben zu können. Bei dieser Beziehung ist die Products-Tabelle die übergeordnete Tabelle und die OrderDetails-Tabelle die untergeordnete Tabelle. Wenn Sie die OrderDetails-Tabelle durchlaufen, wird GetParentRow folglich aufgerufen, um den zugehörigen ProductName-Wert abzurufen.

Beachten Sie, dass bei der Erstellung 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 die Orders-Tabelle eine CustomerID besitzt, die nicht in der Customers-Tabelle vorhanden ist, wird durch eine ForeignKeyConstraint eine Ausnahme ausgelöst.

In Situationen, in denen die untergeordnete Spalte möglicherweise Werte enthält, die in der übergeordneten Spalte nicht enthalten sind, legen Sie False für das createConstraints-Flag beim Hinzufügen der DataRelation 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 einen Teil der Datensätze aus der Orders-Tabelle zurückzugeben, ohne dass bei der Ausführung eine Ausnahme ausgelöst wird. Das erweiterte Beispiel generiert Ausgabe im folgenden Format:

      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 ein Teil der Datensätze der Orders-Tabelle zurückgegeben.

Dim custOrderRel As DataRelation = custDS.Relations.Add("CustOrders", _
                     custDS.Tables("Customers").Columns("CustomerID"), _
                     custDS.Tables("Orders").Columns("CustomerID"))

Dim orderDetailRel As DataRelation = custDS.Relations.Add("OrderDetail", _
                     custDS.Tables("Orders").Columns("OrderID"), _
                     custDS.Tables("OrderDetails").Columns("OrderID"), false)

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

Dim custRow, orderRow, detailRow As DataRow

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

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

    For Each detailRow In orderRow.GetChildRows(orderDetailRel)
        Console.WriteLine(vbTab & "   Product: " & detailRow.GetParentRow(orderProductRel)("ProductName").ToString())
        Console.WriteLine(vbTab & "  Quantity: " & detailRow("Quantity").ToString())
    Next
  Next
Next
[C#]
DataRelation custOrderRel = custDS.Relations.Add("CustOrders",
                     custDS.Tables["Customers"].Columns["CustomerID"],
                     custDS.Tables["Orders"].Columns["CustomerID"]);

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

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

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

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

    foreach (DataRow detailRow in orderRow.GetChildRows(orderDetailRel))
    {
        Console.WriteLine("\t   Product: " + detailRow.GetParentRow(orderProductRel)["ProductName"]);
        Console.WriteLine("\t  Quantity: " + detailRow["Quantity"]);
    }
  }
}

Siehe auch

Erstellen und Verwenden von DataSets | DataRelation-Klasse | DataRow-Klasse | DataSet-Klasse