Esplorazione di oggetti DataRelationNavigating DataRelations

Una delle funzioni principali di un oggetto DataRelation è di consentire la navigazione da una DataTable all'altra all'interno di un DataSet.One of the primary functions of a DataRelation is to allow navigation from one DataTable to another within a DataSet. In questo modo è possibile recuperare tutti gli DataRow gli oggetti in uno DataTable quando viene specificato un singolo DataRow da un processo di DataTable.This allows you to retrieve all the related DataRow objects in one DataTable when given a single DataRow from a related DataTable. Ad esempio, dopo aver stabilito un DataRelation tra una tabella di clienti e una tabella di ordini, è possibile recuperare tutte le righe di ordine per un particolare cliente usando GetChildRows.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.

L'esempio di codice seguente crea un DataRelation tra il clienti tabella e ordini tabella di un DataSet e restituisce tutti gli ordini per ogni cliente.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

Nell'esempio successivo, basato su quello precedente, vengono correlate quattro tabelle e vengono esplorate tali relazioni.The next example builds on the preceding example, relating four tables together and navigating those relationships. Come nell'esempio precedente, CustomerID si riferisce il clienti tabella il ordini tabella.As in the previous example, CustomerID relates the Customers table to the Orders table. Per ogni cliente nel clienti tabella, tutte le righe figlio il ordini tabella dipendono, per restituire il numero di ordini di un determinato cliente e le relative OrderID valori.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.

Nell'esempio espanso restituisce anche i valori di OrderDetails e prodotti tabelle.The expanded example also returns the values from the OrderDetails and Products tables. Il ordini tabella è correlata al OrderDetails tramite OrderID per determinare per ogni ordine del cliente, quali prodotti e le quantità ordinate.The Orders table is related to the OrderDetails table using OrderID to determine, for each customer order, what products and quantities were ordered. Poiché il OrderDetails tabella contiene solo il ProductID di un prodotto ordinato, OrderDetails è correlata a prodotti utilizzando ProductID per restituire il ProductName.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 questo tipo di relazione di prodotti è la tabella padre e Order Details è la tabella figlio.In this relation, the Products table is the parent and the Order Details table is the child. Di conseguenza, quando si scorre il OrderDetails tabella GetParentRow viene chiamata per recuperare l'oggetto correlato ProductName valore.As a result, when iterating through the OrderDetails table, GetParentRow is called to retrieve the related ProductName value.

Si noti che quando il DataRelation viene creato per il clienti e ordini tabelle, viene specificato alcun valore per il createConstraintsflag (il valore predefinito è 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). Si presuppone che tutte le righe il ordini tabella hanno un CustomerID valore esistente nell'elemento padre clienti tabella.This assumes that all the rows in the Orders table have a CustomerID value that exists in the parent Customers table. Se un CustomerID esiste nel ordini tabella che non esiste nel clienti tabella, una ForeignKeyConstraint viene generata un'eccezione.If a CustomerID exists in the Orders table that does not exist in the Customers table, a ForeignKeyConstraint causes an exception to be thrown.

Quando la colonna figlio può contenere valori che non contiene la colonna padre, impostare il createConstraints flag false quando si aggiunge il DataRelation.When the child column might contain values that the parent column does not contain, set the createConstraints flag to false when adding the DataRelation. Nell'esempio di createConstraints flag è impostato su false per il DataRelation tra il ordini tabella e il OrderDetails tabella.In the example, the createConstraints flag is set to false for the DataRelation between the Orders table and the OrderDetails table. Questo consente all'applicazione restituire tutti i record di OrderDetails tabella e solo un subset di record dal ordini tabella senza generare un'eccezione in fase di esecuzione.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. Nell'esempio espanso viene generato un output con il seguente formato.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  

L'esempio di codice seguente è un esempio ampliato in cui i valori di OrderDetails e prodotti vengono restituite le tabelle, solo un subset dei record del ordinitabella restituita.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

Vedere ancheSee Also

Oggetti DataSet, DataTable e DataViewDataSets, DataTables, and DataViews
Provider gestiti ADO.NET e Centro per sviluppatori di set di datiADO.NET Managed Providers and DataSet Developer Center