Freigeben über


Navigieren in DataRelations

Eine der hauptfunktionen einer DataRelation ist das Zulassen der Navigation von einem DataTable zu einem anderen innerhalb eines DataSet. Auf diese Weise können Sie alle zugehörigen DataRow Objekte in einem DataTable Objekt abrufen, wenn sie eine einzelne DataRow aus einer verknüpften DataTable erhalten. Beispielsweise können Sie nach dem Einrichten einer DataRelation Zwischentabelle von Kunden und einer Tabelle mit Bestellungen alle Bestellzeilen für eine bestimmte Kundenzeile mithilfe von GetChildRows abrufen.

Das folgende Codebeispiel erstellt eine DataRelation zwischen der Customers-Tabelle und der Orders-Tabelle eines DataSet und gibt alle Bestellungen für jeden Kunden zurück.

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 vorherigen Beispiel auf und bezieht vier Tabellen zusammen und navigiert in diesen Beziehungen. Wie im vorherigen Beispiel CustomerID bezieht sich die Customers Tabelle auf die Orders Tabelle. Für jeden Kunden in der Customers Tabelle werden alle untergeordneten Zeilen in der Orders Tabelle bestimmt, um die Anzahl der Bestellungen zurückzugeben, die ein bestimmter Kunde hat, und deren OrderID Werte.

Im erweiterten Beispiel werden auch die Werte aus den OrderDetails- und Products-Tabellen zurückgegeben. Die Orders Tabelle bezieht sich auf die OrderDetails Tabelle, OrderID die verwendet wird, um für jeden Kundenauftrag zu bestimmen, welche Produkte und Mengen bestellt wurden. Da die OrderDetails Tabelle nur ProductID eines bestellten Produkts enthält, wird OrderDetails mit Products unter Verwendung von ProductID in Beziehung gesetzt, um den ProductName zurückzugeben. In dieser Beziehung ist die Tabelle Products das übergeordnete Element und die Tabelle "Bestelldetails" das untergeordnete Element. Daher wird beim Durchlaufen der OrderDetails-Tabelle GetParentRow aufgerufen, um den zugehörigen ProductName-Wert abzurufen.

Beachten Sie, dass beim Erstellen des DataRelation für die Tabellen Customers und Orders kein Wert für das createConstraints-Flagge angegeben wird (der Standardwert ist wahr). Dabei wird davon ausgegangen, dass alle Zeilen in der Orders Tabelle einen CustomerID Wert aufweisen, der in der übergeordneten Customers Tabelle vorhanden ist. Wenn ein CustomerID in der Orders-Tabelle existiert, das nicht in der Customers-Tabelle existiert, wird eine Ausnahme durch ForeignKeyConstraint ausgelöst.

Wenn die untergeordnete Spalte möglicherweise Werte enthält, die die übergeordnete Spalte nicht enthält, setzen Sie das Kennzeichen createConstraints auf false, wenn Sie die DataRelation hinzufügen. Im Beispiel wird die createConstraints-Kennzeichnung zwischen der false-Tabelle und der DataRelation-Tabelle auf Orders gesetzt. Dadurch kann die Anwendung alle Datensätze aus der OrderDetails Tabelle und nur eine Teilmenge von Datensätzen aus der Orders Tabelle zurückgeben, ohne eine Laufzeit ausnahme zu generieren. 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 ein erweitertes Beispiel, in dem die Werte aus den OrderDetails Und-Tabellen Products zurückgegeben werden, wobei nur eine Teilmenge der Datensätze in der Orders Tabelle zurückgegeben wird.

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