Share via


Navigeren in DataRelations

Een van de primaire functies van een DataRelation is het toestaan van navigatie van het ene DataTable naar het andere binnen een DataSet. Hiermee kunt u alle gerelateerde DataRow objecten in één gegevenstabel ophalen wanneer u één DataRow uit een gerelateerde gegevenstabel krijgt. Nadat u bijvoorbeeld een DataRelation hebt gemaakt tussen een tabel met klanten en een tabel met orders, kunt u alle orderrijen voor een bepaalde klantrij ophalen met Behulp van GetChildRows.

In het volgende codevoorbeeld wordt een DataRelation gemaakt tussen de tabel Klanten en de tabel Orders van een DataSet en worden alle orders voor elke klant geretourneerd.

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

Het volgende voorbeeld is gebaseerd op het voorgaande voorbeeld, waarbij vier tabellen aan elkaar zijn gekoppeld en door deze relaties worden ge navigeerd. Net als in het vorige voorbeeld heeft CustomerID de tabel Klanten betrekking op de tabel Orders . Voor elke klant in de tabel Klanten worden alle onderliggende rijen in de tabel Orders bepaald om het aantal orders te retourneren dat een bepaalde klant heeft en de bijbehorende OrderID-waarden .

Het uitgevouwen voorbeeld retourneert ook de waarden uit de tabellen Orderdetails en Producten . De tabel Orders is gerelateerd aan de tabel Orderdetails met behulp van OrderID om te bepalen welke producten en hoeveelheden er zijn besteld voor elke klantorder. Omdat de tabel Orderdetails alleen de Product-id van een besteld product bevat, is OrderDetails gerelateerd aan Producten die ProductID gebruiken om de ProductName te retourneren. In deze relatie is de tabel Producten de bovenliggende tabel en is de tabel Ordergegevens de onderliggende tabel. Als gevolg hiervan wordt GetParentRow aangeroepen bij het doorlopen van de tabel OrderDetails om de gerelateerde ProductName-waarde op te halen.

Wanneer de DataRelation wordt gemaakt voor de tabellen Klanten en Orders, wordt er geen waarde opgegeven voor de vlag createConstraints (de standaardwaarde is waar). Hierbij wordt ervan uitgegaan dat alle rijen in de tabel Orders een CustomerID-waarde hebben die bestaat in de bovenliggende tabel Klanten . Als er een CustomerID bestaat in de tabel Orders die niet in de tabel Klanten bestaat, wordt er een ForeignKeyConstraint uitzondering gegenereerd.

Wanneer de onderliggende kolom mogelijk waarden bevat die de bovenliggende kolom niet bevat, stelt u de vlag createConstraints in op false bij het toevoegen van de DataRelation. In het voorbeeld is de vlag createConstraints ingesteld op false voor de DataRelation tussen de tabel Orders en de tabel OrderDetails . Hierdoor kan de toepassing alle records uit de tabel Orderdetails en slechts een subset records uit de tabel Orders retourneren zonder een runtime-uitzondering te genereren. Het uitgebreide voorbeeld genereert uitvoer in de volgende indeling.

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  

Het volgende codevoorbeeld is een uitgebreid voorbeeld waarin de waarden uit de tabellen Orderdetails en Producten worden geretourneerd, waarbij alleen een subset van de records in de tabel Orders wordt geretourneerd.

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

Zie ook