【问题标题】:Adding empty rows to a DataTable将空行添加到 DataTable
【发布时间】:2014-12-26 14:03:38
【问题描述】:

是否可以通过一次调用向 DataTable 添加几行?

问题是我需要创建一个 DataTable,其中每列在写入 DataTable 之前都需要进行先前的处理。逐行写会很不方便。

即,我需要创建一个包含 N 个空行的 DataTable,然后以列为基础写入值。

【问题讨论】:

  • 是的,我知道可以通过循环来完成。我正在寻找一个更“优雅”的解决方案,即没有循环。所以似乎不可能。

标签: c# .net datatable


【解决方案1】:

您不能在没有循环的情况下添加多行。如果您想将 n 行添加到所有列均为“空”的 DataTable,请使用不带参数的 DataRowCollection.Add

for(int i = 0; i < n; i++)
    table.Rows.Add();  // all fields get their default value

【讨论】:

    【解决方案2】:

    在你的for循环中,(显然需要一个forloop来添加多行),你想使用

    for(int i = 0; i < n; i++)
        table.Rows.Add();   
    

    如果您知道要在行中放入什么,则可以调整此代码:

    DataRow newBlankRow = theDataTable.NewRow();
    theDataTable.Rows.InsertAt(newBlankRow, theDataTable.Rows.Count);
    

    【讨论】:

      【解决方案3】:

      对于有很多行的表格,更好的解决方案是使用“表格预制件”。 让我们看一个例子。 我们需要更新目标 (DST) 表的 100k 行。我们有外部源(SRC)表。我们知道 SRC 中的某些行可能不存在,这意味着该特定行的列是 DBNULL。 如果我们只是将 SRC 合并到 DST,那么旧数据仍然会在 DST 中。因此,为了清除这些数据,我们首先需要清除将从 SRC 导入数据的列中的所有数据,并保存另一个数据(实际上是从另一个源表中获取的)。

      不推荐使用“For...Next” - 需要太多时间。 接下来我会做:

      1. 创建临时表 (TMP),其中仅包含 PrimaryKey 匹配 DST.PriaryKey 的列(还没有任何行)
      2. 将数据从 DST 合并到 TMP - 这将只创建行
      3. 手动添加与 SRC 匹配的列 - 这将创建“空”行
      4. 将 TMP 合并到 DST
      5. 然后将 SRC 合并到 DST

      这是VB中的代码:

      Dim tmp As DataTable = New DataTable
      Dim pk(dst.PrimaryKey.Length - 1) As DataColumn
      For Each col As DataColumn In dst.PrimaryKey
          pk(j) = tmp.Columns.Add(col.ColumnName, col.DataType)
          j += 1
      Next
      tmp.PrimaryKey = pk
      tmp.Merge(src, False, MissingSchemaAction.Ignore) 'add rows
      For Each col As DataColumn In src.Columns 'add empty columns
          If dst.Columns.Contains(col.ColumnName) _
          AndAlso Not tmp.Columns.Contains(col.ColumnName) _
          Then tmp.Columns.Add(col.ColumnName, col.DataType)
      Next
      dst.Merge(tmp, True, MissingSchemaAction.Ignore) 'clear destination columns
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-28
        • 2013-09-21
        • 1970-01-01
        • 1970-01-01
        • 2014-01-27
        • 1970-01-01
        • 1970-01-01
        • 2019-02-28
        相关资源
        最近更新 更多