Navigace v datových relacích

Jednou z primárních funkcí a DataRelation je povolit navigaci mezi sebou DataTable v rámci DataSet. To vám umožní načíst všechny související DataRow objekty v jedné DataTable při zadání jednoho DataRow ze související DataTable. Například po vytvoření datové relace mezi tabulkou zákazníků a tabulkou objednávek můžete načíst všechny řádky objednávek pro konkrétní řádek zákazníka pomocí GetChildRows.

Následující příklad kódu vytvoří DataRelation mezi tabulka Customers a Orders tabulky DataSet a vrátí všechny objednávky pro každého zákazníka.

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

Další příklad vychází z předchozího příkladu, který spojuje čtyři tabulky a přecházá mezi těmito relacemi. Stejně jako v předchozím příkladu se ID zákazníka vztahuje k tabulce Zákazníci s tabulkou Objednávky . Pro každého zákazníka v tabulce Zákazníci se určí všechny podřízené řádky v tabulce Objednávky , aby bylo možné vrátit počet objednávek, které má konkrétní zákazník, a jejich hodnoty ORDERID .

Rozbalený příklad také vrátí hodnoty z tabulek OrderDetails a Products . Tabulka Objednávky souvisí s tabulkou OrderDetails pomocí OrderID k určení, pro každou objednávku zákazníka, jaké produkty a množství byly objednány. Vzhledem k tomu, že tabulka OrderDetails obsahuje pouze IDProduktu objednaného produktu, vztahuje se OrderDetails k produktům používajícím IDproduktu, aby bylo možné produkt vrátit. V tomto vztahu je tabulka Products nadřazenou položkou a tabulka Podrobnosti objednávky je podřízená. Výsledkem je, že při iterování prostřednictvím tabulky OrderDetails se volá GetParentRow pro načtení související hodnoty ProductName .

Všimněte si, že při vytvoření DataRelation pro tabulky Customers and Orders není zadána žádná hodnota příznaku createConstraints (výchozí hodnota je true). Předpokládá se, že všechny řádky v tabulce Objednávky mají hodnotu CustomerID , která existuje v nadřazené tabulce Zákazníci . Pokud v tabulce Objednávky existuje ID zákazníka, které v tabulce Zákazníci neexistuje, ForeignKeyConstraint vyvolá se výjimka.

Pokud podřízený sloupec může obsahovat hodnoty, které nadřazený sloupec neobsahuje, nastavte příznak createConstraints na false při přidávání dataRelation. V příkladu je příznak createConstraints nastaven na false pro DataRelation mezi tabulka Orders a OrderDetails tabulka. Aplikace tak může vrátit všechny záznamy z tabulky OrderDetails a pouze podmnožinu záznamů z tabulky Orders bez generování výjimky za běhu. Rozšířená ukázka generuje výstup v následujícím formátu.

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  

Následující příklad kódu je rozšířená ukázka, kde jsou vráceny hodnoty z tabulek OrderDetails a Products , přičemž se vrací pouze podmnožina záznamů v tabulce Orders .

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

Viz také