Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Uma das principais funções de um DataRelation é permitir a navegação de um DataTable para outro dentro de um DataSet. Isto permite-lhe recuperar todos os objetos relacionados DataRow num só DataTable quando recebe um único DataRow de uma DataTable relacionada. Por exemplo, depois de estabelecer uma DataRelation relação entre uma tabela de clientes e uma tabela de encomendas, pode recuperar todas as linhas de encomendas de uma determinada linha de cliente usando GetChildRows.
O exemplo de código seguinte cria um DataRelation entre a Customers tabela e a Orders tabela de um DataSet e retorna todas as encomendas de cada cliente.
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
O próximo exemplo se baseia no exemplo anterior, relacionando quatro tabelas juntas e navegando nessas relações. Tal como no exemplo anterior, CustomerID relaciona a Customers tabela com a Orders tabela. Para cada cliente na tabela Customers, todas as linhas filhas da tabela Orders são determinadas, de modo a devolver o número de encomendas que um determinado cliente tem e os valores de OrderID dessas encomendas.
O exemplo expandido também devolve os valores das OrderDetails tabelas e Products . A tabela Orders está relacionada com a tabela OrderDetails utilizando OrderID para determinar, para cada encomenda de cliente, quais produtos e quantidades foram encomendados. Como a OrderDetails tabela contém apenas o ProductID de um produto encomendado, OrderDetails está relacionado com Products utilizando ProductID para devolver o NomeDoProduto. Nesta relação, a Products tabela é a principal e a tabela de Detalhes da Encomenda é a secundária. Como resultado, ao percorrer a OrderDetails tabela, GetParentRow é invocado para recuperar o valor relacionado ProductName.
Note que, quando o DataRelation é criado para as tabelas Customers e Orders, não é especificado nenhum valor para a flag createConstraints (o padrão é true). Isto pressupõe que todas as linhas da Orders tabela têm um CustomerID valor que existe na tabela principal Customers . Se a CustomerID existir na Orders tabela que não existe na Customers tabela, a ForeignKeyConstraint provoca que seja lançada uma exceção.
Quando a coluna filha pode conter valores que a coluna pai não contém, defina a createConstraints flag para false ao adicionar a DataRelation. No exemplo, o createConstraints sinalizador é definido como false para o DataRelation entre a Orders tabela e a OrderDetails tabela. Isto permite que a aplicação retorne todos os registos da OrderDetails tabela e apenas um subconjunto de registos da Orders tabela sem gerar uma exceção em tempo de execução. O exemplo expandido gera saída no seguinte formato.
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
O exemplo de código seguinte é uma amostra expandida onde os valores das OrderDetails tabelas e Products são devolvidos, sendo apenas um subconjunto dos registos na Orders tabela devolvido.
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