我正在使用Vb.Net Project,通过Web服务调用方法我在DataTable的Object中获得结果,现在我需要在本地计算后添加更多列,我在循环中完成所有操作并通过循环添加一个列的数据或者修改它,对于一个更大的DataTable来说,它也是时间。 是否有任何逻辑我一次性添加这些列而不是遍历每个DataRow?
假设我有一个包含4列的DataTable,( Name = dt ) 我需要再添加两个。
对于2000行,我必须为每一行初始化新添加的列的值。
****假设我在Temp表中计算了新的临时列。 是否有任何方法可以通过连接更新新添加的列( 添加到dt )的值基于共同的表(在VB.NET代码中)列(主键列)****
答案 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")
:
"SaleIDRelation"