Menavigasi DataRelations
Salah satu fungsi utama DataRelation adalah memungkinkan navigasi dari satu DataTable ke yang lain dalam DataSet. Hal ini memungkinkan Anda mengambil semua objek DataRow terkait dalam satu DataTable saat diberikan satu DataRow dari DataTable yang terkait. Misalnya, setelah membuat DataRelation antara tabel pelanggan dan tabel pesanan, Anda dapat mengambil semua baris pesanan untuk baris pelanggan tertentu menggunakan GetChildRows.
Contoh kode berikut membuat DataRelation antara tabel Pelanggan dan tabel Pesanan dari DataSet dan mengembalikan semua pesanan untuk setiap pelanggan.
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
Contoh berikutnya dibangun di atas contoh sebelumnya, menghubungkan empat tabel bersama-sama dan menavigasi hubungan tersebut. Seperti pada contoh sebelumnya, CustomerID menghubungkan tabel Pelanggan ke tabel Pesanan. Untuk setiap pelanggan di tabel Pelanggan, semua baris turunan di tabel Pesanan ditentukan, untuk mengembalikan jumlah pesanan yang dimiliki pelanggan tertentu dan nilai OrderID mereka.
Contoh yang diperluas juga mengembalikan nilai dari tabel OrderDetails dan Produk. Tabel Pesanan terkait dengan tabel OrderDetails menggunakan OrderID untuk menentukan, setiap pesanan pelanggan, produk apa dan jumlah yang dipesan. Karena tabel OrderDetails hanya berisi ProductID dari produk yang dipesan, OrderDetails terkait dengan Produk menggunakan ProductID untuk mengembalikan ProductName. Dalam hubungan ini, tabel Produk adalah induk dan tabel Detail Pesanan adalah turunannya. Akibatnya, saat mengulangi melalui tabel OrderDetails, GetParentRow dipanggil untuk mengambil nilai ProductName terkait.
Perhatikan bahwa ketika DataRelation dibuat untuk tabel Pelanggan dan Pesanan, tidak ada nilai yang ditentukan untuk bendera createConstraints (defaultnya adalah true). Ini mengasumsikan bahwa semua baris dalam tabel Pesanan memiliki nilai CustomerID yang ada di tabel Pelanggan induk. Jika CustomerID ada di tabel Pesanan yang tidak ada di tabel Pelanggan, ForeignKeyConstraint menyebabkan pengecualian ditampilkan.
Jika kolom turunan mungkin berisi nilai yang tidak ada di kolom induk, atur bendera createConstraints ke false saat menambahkan DataRelation. Dalam contoh, tanda createConstraints diatur ke false untuk DataRelation antara tabel Pesanan dan tabel OrderDetails. Ini memungkinkan aplikasi untuk mengembalikan semua catatan dari tabel OrderDetails dan hanya sebagian catatan dari tabel Pesanan tanpa menghasilkan pengecualian runtime. Sampel yang diperluas menghasilkan output dalam format berikut.
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
Contoh kode berikut adalah contoh yang diperluas di mana nilai-nilai dari tabel OrderDetails dan Produk dikembalikan, dengan hanya sebagian dari catatan dalam tabel Pesanan yang dikembalikan.
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