Navigieren in "DataRelations"Navigating DataRelations

Eine der Hauptfunktionen einer DataRelation besteht darin, die Navigation von einer DataTable zu einer anderen innerhalb eines DataSet zu ermöglichen.One of the primary functions of a DataRelation is to allow navigation from one DataTable to another within a DataSet. Auf diese Weise können Sie alle verknüpften DataRow Objekte in einer Daten Tabelle abrufen, wenn Sie eine einzelne DataRow aus einer verknüpften DatenTabelle erhalten.This allows you to retrieve all the related DataRow objects in one DataTable when given a single DataRow from a related DataTable. Nachdem Sie z. b. eine DataRelations zwischen einer Tabelle mit Kunden und einer Tabelle mit Bestellungen eingerichtet haben, können Sie mithilfe von GetChildRowsalle Auftragszeilen für eine bestimmte Kunden Zeile abrufen.For example, after establishing a DataRelation between a table of customers and a table of orders, you can retrieve all the order rows for a particular customer row using GetChildRows.

Im folgenden Codebeispiel wird eine DataRelations zwischen der Customers -Tabelle und der Orders -Tabelle eines DataSets erstellt und alle Bestellungen für jeden Kunden zurückgegeben.The following code example creates a DataRelation between the Customers table and the Orders table of a DataSet and returns all the orders for each customer.

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.The next example builds on the preceding example, relating four tables together and navigating those relationships. Wie im vorherigen Beispiel verknüpft CustomerID die Customers -Tabelle mit der Orders -Tabelle.As in the previous example, CustomerID relates the Customers table to the Orders table. Für jeden Kunden in der Customers -Tabelle werden alle untergeordneten Zeilen in der Orders -Tabelle bestimmt, um die Anzahl der Bestellungen eines bestimmten Kunden und deren OrderID -Werte zurückzugeben.For each customer in the Customers table, all the child rows in the Orders table are determined, in order to return the number of orders a particular customer has and their OrderID values.

Das erweiterte Beispiel gibt auch die Werte aus den Tabellen Order Details und Products zurück.The expanded example also returns the values from the OrderDetails and Products tables. Die Orders -Tabelle bezieht sich auf die Order Details -Tabelle mithilfe von OrderID , um für jeden Kundenauftrag festzustellen, welche Produkte und Mengen sortiert wurden.The Orders table is related to the OrderDetails table using OrderID to determine, for each customer order, what products and quantities were ordered. Da die Order Details -Tabelle nur die ProductID eines bestellten Produkts enthält, steht Order Details im Zusammenhang mit Produkten , die ProductID verwenden, um ProductNamezurückzugeben.Because the OrderDetails table only contains the ProductID of an ordered product, OrderDetails is related to Products using ProductID in order to return the ProductName. In dieser Beziehung ist die Tabelle " Products " das übergeordnete Element, und die Tabelle " Order Details " ist das untergeordnete Element.In this relation, the Products table is the parent and the Order Details table is the child. Daher wird beim Durchlaufen der Order Details -Tabelle getparameentrow aufgerufen, um den zugehörigen ProductName -Wert abzurufen.As a result, when iterating through the OrderDetails table, GetParentRow is called to retrieve the related ProductName value.

Beachten Sie, dass bei der Erstellung der DataRelations -Tabelle für die Customers -und Orders -Tabelle kein Wert für das Flag "" vom Typ " anateconstraints " angegeben wird (Standardwert: true).Notice that when the DataRelation is created for the Customers and Orders tables, no value is specified for the createConstraints flag (the default is true). Dabei wird davon ausgegangen, dass alle Zeilen in der Orders -Tabelle einen CustomerID- Wert aufweisen, der in der übergeordneten Customers -Tabelle vorhanden ist.This assumes that all the rows in the Orders table have a CustomerID value that exists in the parent Customers table. Wenn eine CustomerID in der Orders -Tabelle vorhanden ist, die in der Customers -Tabelle nicht vorhanden ist, wird ein ForeignKeyConstraint bewirkt, dass eine Ausnahme ausgelöst wird.If a CustomerID exists in the Orders table that does not exist in the Customers table, a ForeignKeyConstraint causes an exception to be thrown.

Wenn die untergeordnete Spalte Werte enthalten kann, die in der übergeordneten Spalte nicht enthalten sind, legen Sie beim Hinzufügen von DataRelationsdas Flag " kreateconstraints " auf " false " fest.When the child column might contain values that the parent column does not contain, set the createConstraints flag to false when adding the DataRelation. In dem Beispiel wird das Flag " kreateconstraints " für " DataRelations " zwischen der Tabelle " Orders " und der Tabelle " Order Details " auf " false " festgelegt.In the example, the createConstraints flag is set to false for the DataRelation between the Orders table and the OrderDetails table. Dadurch kann die Anwendung alle Datensätze aus der Tabelle Order Details und nur eine Teilmenge der Datensätze aus der Tabelle Orders zurückgeben, ohne eine Lauf Zeit Ausnahme zu erzeugen.This enables the application to return all the records from the OrderDetails table and only a subset of records from the Orders table without generating a run-time exception. Im erweiterten Beispiel wird die Ausgabe im folgenden Format generiert:The expanded sample generates output in the following 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 ein erweitertes Beispiel, bei dem die Werte aus den Tabellen Order Details und Products zurückgegeben werden, wobei nur eine Teilmenge der Datensätze in der Orders -Tabelle zurückgegeben wird.The following code example is an expanded sample where the values from the OrderDetails and Products tables are returned, with only a subset of the records in the Orders table being returned.

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 auchSee also