.Net C#DataTables和DataSet,如何关联表

时间:2009-07-13 20:58:08

标签: c# datatable dataset

如何将几个数据表放在一个数据集中并将它们联系起来(甚至听起来不像是正确的英语)呢?

我知道如何创建数据表。

8 个答案:

答案 0 :(得分:9)

以下是我的一个班级

的示例
// create the relationship between Booking and Booking_MNI
DataRelation relBookingMNI;                         
relBookingMNI = new DataRelation("BookingToBookingMNI",dsBooking.Tables["Booking"].Columns["Record_Id"],dsBooking.Tables["Booking_MNI"].Columns["booking_record_id"]);
dsBooking.Relations.Add(relBookingMNI);

dsBooking是我的主数据集,包含2个表Booking和Booking_MNI 其中Record_Id是主键,booking_record_id是外键

我更改了下面的代码以匹配我的第一个示例。但我认为这正是你要找的。在我们的生产代码中,这将在行的左侧生成加号“+”符号,这将允许您钻取到相关表中。我再次使用生产代码并使其看起来像第一个示例,所以我不知道它是否会编译,但它应该让你朝着正确的方向前进。

DataTable dtBooking = ds.Tables[0];
DataTable dtBooking_MNI = ds.Tables[1];

dtBooking.PrimaryKey = new DataColumn[] {dtBooking.Columns["Record_Id"]};
dtBooking_MNI.PrimaryKey = new DataColumn[] {dtBooking_MNI.Columns["booking_Record_Id"]};

/* Setup DataRelation between the DataTables */
DataColumn[] dcBookingColsArray = new DataColumn[1] {dtBooking.Columns["Record_Id"]};
DataColumn[] dcBookingMNIColsArray = new DataColumn[1] {dtBooking_MNI.Columns["booking_record_Id"]};

DataRelation relBooking_To_MNI = new DataRelation("Booking_To_MNI",dcBookingColsArray,dcBookingMNIColsArray);
ds.Relations.Add(relBooking_To_MNI_Units);

// grid where you want to display the relationship
grdBooking.DataSource = ds;

答案 1 :(得分:3)

查看DataRelation类。它是DataSet中用于将两个DataTable相关联的内容。

答案 2 :(得分:2)

假设您的DataTables名为“orders”和“orderDetails”。您希望通过OrderNumber列在它们之间创建关系。我们假设订单是父订单,orderDetails是子订单。我们希望遍历订单,然后打印每个订单的相关小计。

DataSet orderData = new DataSet("OrderData");

orderData.Tables.Add(orders);
orderData.Tables.Add(orderDetails);

orderData.Relations.Add("Order_OrderDetails", orders.Columns["OrderNumber"], orderDetails.Columns["OrderNumber"]);

现在,当您想在代码中的其他位置使用该关系时:

DataRelation orderRelation = orderData.Relations["Order_OrderDetails"];

foreach (DataRow order in orders.Rows)
{
   Console.WriteLine("Subtotals for Order {0}:", order["OrderNumber"]);

   foreach (DataRow orderDetail in order.GetChildRows(orderRelation))
   {
      Console.WriteLine("Order Line {0}: {1}", orderDetail["OrderLineNumber"], string.Format("{0:C}", orderDetail["Price"]));
   }
}

答案 3 :(得分:1)

这里尝试这是两个表1.类别& 2.产品

        string query = "SELECT * FROM Categories; SELECT * FROM Products";

        SqlConnection con = new SqlConnection();
        SqlDataAdapter da = new SqlDataAdapter(query,con);
        DataSet ds = new DataSet();
        da.Fill(ds, "CategoriesAndProducts");     //CategoriesAndProducts dataset

        string s = ds.Tables[0].Rows[0]["Name"].ToString();  
        string s1 = ds.Tables[1].Rows[0]["Name"].ToString(); 

        Console.WriteLine(s);  //from categories [0][0] like Electronic
        Console.WriteLine(s1); //from Products  [0][0]  like LG

答案 4 :(得分:0)

答案 5 :(得分:0)

也许您正在寻找ormEntity FrameworkNHibernateLinq to SQL解决方案?

如果我误解了这个问题,请注意。

答案 6 :(得分:0)

如果您使用Visual Studio 2005或更高版本,请尝试以下操作: 右键单击您的项目并选择“Add / NewItem ...”,然后从向导中选择DataSet,这将创建一些xsd并打开数据集设计器。 现在,您可以创建多个表,向每个表添加列,并在这些表之间绘制关系(外键,有/无级联...)。 在自动生成的[YourNewDataSet} .Designer.cs文件中,您将找到这些关系的源代码。 像这样:

this.relationFK_DataTable2_DataTable1 = new global::System.Data.DataRelation("FK_DataTable2_DataTable1", new global::System.Data.DataColumn[] {
                    this.tableDataTable2.asdfasColumn}, new global::System.Data.DataColumn[] {
                    this.tableDataTable1.asdfaColumn}, false);

如果你手动编码而不是使用设计师,你可以像往常一样剥离这部分代码。

答案 7 :(得分:0)

private void CreateRelation() 
 {
   // Get the DataColumn objects from two DataTable objects 
   // in a DataSet. Code to get the DataSet not shown here.
   DataColumn parentColumn = 
   DataSet1.Tables["Customers"].Columns["CustID"];
   DataColumn childColumn = 
   DataSet1.Tables["Orders"].Columns["CustID"];
   // Create DataRelation.
   DataRelation relCustOrder;
   relCustOrder = new DataRelation("CustomersOrders", 
   parentColumn, childColumn);
   // Add the relation to the DataSet.
   DataSet1.Relations.Add(relCustOrder);
  }