动态地将列添加到Vb.net中的现有DataTable

时间:2015-06-11 07:29:26

标签: vb.net join datatable datarow datacolumn

我正在使用Vb.Net Project,通过Web服务调用方法我在DataTable的Object中获得结果,现在我需要在本地计算后添加更多列,我在循环中完成所有操作并通过循环添加一个列的数据或者修改它,对于一个更大的DataTable来说,它也是时间。 是否有任何逻辑我一次性添加这些列而不是遍历每个DataRow?

假设我有一个包含4列的DataTable,( Name = dt ) 我需要再添加两个。

对于2000行,我必须为每一行初始化新添加的列的值。

****假设我在Temp表中计算了新的临时列。 是否有任何方法可以通过连接更新新添加的列( 添加到dt )的值基于共同的表(在VB.NET代码中)列(主键列)****

1 个答案:

答案 0 :(得分:1)

  

假设我在Temp中计算了新的临时列   表。有没有办法让我可以更新新添加的值   通过连接的列(添加到dt)中的表(在VB.NET代码中)   公共列的基础(主键列)

如果tempTbl与主表(包含数据)位于同一个DataSet中,并且您具有1:1的匹配关键关系:是,您可以。

在DataSet中的两个表之间添加DataRelation,并使用它来检索组合的DataRow,其中包含所有相关表的列。

    '   the variables
    Dim DSet As DataSet = New DataSet("DSet")
    Dim DTbl1 As DataTable = New DataTable("One")
    Dim DTbl2 As DataTable = New DataTable("Two")
    Dim DRelation As DataRelation

    '   setting up sample tables
    DTbl1.Columns.Add("SaleID", GetType(Integer))
    DTbl1.Columns.Add("ProductName", GetType(String))
    DTbl1.Columns.Add("AmountSold", GetType(Double))
    DTbl1.Columns.Add("ItemPrice", GetType(Double))

    DTbl2.Columns.Add("SaleID", GetType(Integer))
    DTbl2.Columns.Add("Turnover", GetType(Double))

    '   host this DataTables in the DataSet
    DSet.Tables.Add(DTbl1)
    DSet.Tables.Add(DTbl2)

    '   this is the exiting part: adding primary keys...
    '   the DataTable.PrimaryKey-property is an Array of DataRow, so I just initialize a new array containing the one column I would like to set as primary key for this table.
    DTbl1.PrimaryKey = {DTbl1.Columns("SaleID")}
    DTbl2.PrimaryKey = {DTbl2.Columns("SaleID")}

    '   ...and the DataRelation
    DRelation = New DataRelation("SaleIDRelation", DSet.Tables("One").Columns(0), DSet.Tables("Two").Columns(0))
    DSet.Relations.Add(DRelation)

    '   populate Tbl1 with some sample data
    DTbl1.Rows.Add(1, "Eggs", 4, 0.2)
    DTbl1.Rows.Add(2, "Apples", 5, 0.5)
    DTbl1.Rows.Add(3, "Milk", 5, 1)

    '   do the calculation
    For Each DRow As DataRow In DSet.Tables("One").Rows
        '   I personally prefer to keep iteration variables scope inside the loops, so the variable can get catched by the GarbegeCollector as soon as the loop is left
        Dim tPrice As Double = 0

        '   I also prefer not to rely on implicit conversion
        tPrice = Convert.ToDouble(DRow("AmountSold")) * Convert.ToDouble(DRow("ItemPrice"))

        '   for each row processed by the loop, add a row to the second table to store the calculations result
        '   this row should have the same SaleID, so the DataReleation will be able to relate the two rows together later on
        DTbl2.Rows.Add(DRow("SaleID"), tPrice)
    Next

    '   so now you'll be able to get the according DataRow(s) of the second table by retriving the depending ChildRows through the DataRelation
    For Each DRow As DataRow In DSet.Tables("One").Rows
        Console.WriteLine(String.Format("Product {0} in SaleID {1} has made a total turnover of {2}", DRow("ProductName"), DRow("SaleID"), DRow.GetChildRows("SaleIDRelation")(0)("Turnover")))
    Next

<强>输出:

Product Eggs in SaleID 1 has made a total turnover of 0,8
Product Apples in SaleID 2 has made a total turnover of 2,5
Product Milk in SaleID 3 has made a total turnover of 5

真正的魔力发生在输出的循环中。我正在访问第一个子行的所需值,因为由于1:1 DataRelation,我确保Tbl1中的每个DataRow在Tbl2中都有一个具有相同SaleID的pedant

所以我所做的是DRow.GetChildRows("SaleIDRelation")(0)("Turnover")

  • DRow (此DataRow)
  • 使用名为"SaleIDRelation"
  • 的DataRelation获取相关的ChildRows
  • 使用找到的第一个 ChildRow,由(0)
  • 表示
  • 在DataRow中,我希望列的值(&#34;营业额&#34;)