【问题标题】:Where does DataRowCollection.Add method insert the new row?DataRowCollection.Add 方法在哪里插入新行?
【发布时间】:2011-02-09 16:32:15
【问题描述】:

我试图找出 DataRowCollection.Add(DataRow row) 将新行插入其数据表的位置。它在表格的末尾,就像一个追加?是随机的吗?

另外,我想在循环数据表时使用它。如果存在某些条件,则添加一个包含不同数据的新行,以通过 For 循环运行到数据表的末尾。这种方法有什么具体问题吗?我还能怎么处理?

编辑:我正在循环访问存储在内存中的 .Net DataTABLE。在此循环操作期间,我没有触及存储原始数据的数据库。 DataTABLE 在循环之前填充,这不是问题。

这里是相关代码:

 DataTable machineANDlastDate = new DataTable();
//Populate machineANDlastDate  

for (int i = 0; i < machineANDlastDate.Rows.Count; i++)
{
   lastFutureDate = DateTime.Parse(machineANDlastDate.Rows[i]["MaxDueDate"].ToString());
   newDateTime = lastFutureDate.AddDays(frequency);    //This is where the new date is created.
   machineSerial = machineANDlastDate.Rows[i]["machineSerial"].ToString();

   if (newDateTime < DateTime.Now)
   {
          machineANDlastDate.Rows.Add(new String[] { machineSerial,         newDateTime.AddDays(frequency).ToString() });

          continue;
   } 
  ...Removed for irrelevancy...
}

这是在数据表末尾添加一行的有效方法吗?

【问题讨论】:

  • 除非是散列,否则加到最后
  • 我认为散列在你有键/值的地方更常见。键是散列的,因此值查找速度很快。
  • 我没有看到哈希与我的情况有任何相关性。我在 DataTable 中使用字符串,不涉及哈希。
  • 我认为 Alex 只是意味着 Add 将新项目添加到除哈希之外的每个集合的末尾。你的集合不是哈希,所以你不会有这个问题。

标签: c# .net datatable for-loop


【解决方案1】:

据我所知,它总是被添加到集合的末尾。

如果您for 循环访问数据库,则应该没有问题,如果您从数据表的开头开始并在其末尾完成或类似的东西。但是,您随后还将循环访问新创建的数据行,我不知道您是否要实现这一点。如果您改为使用 foreach 循环,您只会遇到问题,因为它无法处理对基础集合的修改。

【讨论】:

  • 是的,我确实想循环浏览新项目,这就是重点。如果存在某个条件,我会修改该数据,然后我想通过循环运行修改后的版本。我知道底层连接的 foreach 循环问题,所以你说 For 循环没有这个问题?
  • 如果您不删除任何项目,如果事先条件仍然有效,我无法想象会有什么问题。 for 和 foreach 两个循环之间的重要区别在于 for 循环的索引。因为您在那里使用索引,所以您可以避免使用 foreach 循环时遇到的问题。希望对您有所帮助。
  • 使用 DataTable 的 Rows.Count 方法作为限制怎么样?每次循环迭代都会更新吗?
  • 那当然可以完成这项工作。如果向 rows 集合添加一行,Rows.Count 属性也会递增,这意味着在下一步中,条件可以再次为真。 i 在循环结束时递增,如果满足条件,Rows.Count 应该已经递增。你上面的代码现在应该可以工作了,还有其他问题吗?
  • 不,我只是不确定插入发生在哪里,并想确保我避免了 foreach 底层集合问题。谢谢!
【解决方案2】:

如果您想知道某行是否是新行,可以查看DataRow.RowState 属性。

// your code to add rows
...

// process added rows
foreach (DataRow row in machineANDlastDate.Rows)
{
    if (row.RowState == DataRowState.Added)
    {
        // do stuff
    }
}

// now confirm new rows (they won't have a RowState of Added after this)
machineANDlastDate.AcceptChanges();

【讨论】:

  • 我不熟悉这个 AcceptChanges() 方法,但我不关心行的来源/时间,我只想在循环到达它时处理它。
  • AcceptChanges 将所有行的 RowState 更改为 Unmodified。当您添加行时,它们以已添加的 RowState 开头 - 您可以使用它来仅处理新行。如果您可能需要重新处理并且不想再次处理相同的行,则只需在完成后调用 AcceptChanges。
【解决方案3】:

它总是在表的末尾,据我所知大多数数据库连接器,当你使用它们的添加行时,它总是在末尾。

【讨论】:

    【解决方案4】:

    Add 方法只会将DataRow 插入到DataRowCollection 对象中。要将DataRow 实际添加到数据表中,您需要调用NewRow 方法,该方法将自身附加到DataTable 上,从而将行附加到该数据库中的表中。供参考,请查看http://msdn.microsoft.com/en-us/library/9yfsd47w.aspx

    【讨论】:

    • 不,恰恰相反。您首先必须使用NewRow 方法创建一个新行,然后,您需要使用Add 方法将其添加到数据表中。 DataTable 是由 DataRowCollection 表示的。
    • 一个 DataTable 包含一个 DataRowCollection(一个 DataTable 有一个 DataRowCollection)。没有相关或链接,DataTable 是许多其他对象的组合,包括一个 DataRowCollection。
    • NewRow 方法将返回一个与表具有相同列结构的行实例。这允许您使用索引器按列引用单元格。填充数据后,您仍需要将该行添加到表中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    相关资源
    最近更新 更多