【问题标题】:.Net C# DataTables and DataSets, How to relate tables.Net C# 数据表和数据集,如何关联表
【发布时间】:2010-11-10 10:58:50
【问题描述】:

您如何获取几个数据表并将它们放入数据集中并关联(这听起来甚至不像正确的英语)?

我知道如何创建数据表。

【问题讨论】:

    标签: c# datatable dataset


    【解决方案1】:

    【讨论】:

    • 我以前用过,但从未使用过,担心要花太多时间才能跟上进度。
    • 值得一看——如果你有空的话
    【解决方案2】:

    查看 DataRelation 类。它是在 DataSet 中用来将两个 DataTable 关联在一起的。

    【讨论】:

      【解决方案3】:

      也许您正在寻找orm 解决方案,例如Entity FrameworkNHibernateLinq to SQL

      抱歉,如果我误解了这个问题。

      【讨论】:

        【解决方案4】:

        这是我的一门课的一个例子

        // 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;
        

        【讨论】:

        • 谢谢你,这很有道理...现在我试试看:)。
        • 所以这很有意义并且有效。嗯,现在是个白痴问题,你怎么把数据拿出来?我将它与 GridView 控件一起使用,并且想知道如何从连接表中获取数据?因此,假设我的主表包含出版物,而我的联接表是所有者(并非所有出版物都有所有者)我如何让所有者信息显示在我的网格视图中?
        【解决方案5】:

        如果您使用 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);
        

        与往常一样,如果您手动编写代码而不是使用设计器,您可以删除该代码的相当一部分。

        【讨论】:

          【解决方案6】:

          假设您的数据表名为“orders”和“orderDetails”。您想通过它们的 OrderNumber 列在它们之间创建关系。我们假设 orders 是父代,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"]));
             }
          }
          

          【讨论】:

          • 感谢 Lloyd,但它如何与 gridview 控件结合使用?
          • 在 GridView 中使用 DataRelation 有很多不同的方法。到目前为止,处理这个问题的最简单方法是创建一个 LINQ to DataSet 查询并绑定它。您还可以创建一个组合的 DataTable 以绑定到您的 GridView 并通过循环遍历父行和子行来填充它,类似于我的示例。然后只需绑定该 DataTable(或者,如果这是 1-1,您可以将列添加到父表并通过相同的循环结构填充它)。此外,您可以在页面中执行此循环并明确设置 GridView 的值。
          • Lloyd,我该如何“...在您的页面中循环执行此操作并明确设置 GridView 的值?”
          【解决方案7】:

          试试这里有两个表 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
          

          【讨论】:

            【解决方案8】:
            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);
              }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-11-24
              • 1970-01-01
              • 2015-01-02
              • 2012-04-11
              • 2013-03-19
              • 2016-04-07
              • 2011-07-10
              • 1970-01-01
              相关资源
              最近更新 更多