向 DataTable 添加空行

9

是否可以通过单个调用向DataTable中添加几行?

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

也就是说,我需要创建一个具有N个空行的DataTable,并在以列为基础的情况下稍后写入值。


是的,我知道可以用循环来实现。但我在寻找一种更“优雅”的解决方案,即不使用循环。所以看起来似乎不可能实现。 - sapito
3个回答

18

如果您想要向一个所有列都为空的DataTable中添加n行,则无法避免使用循环。可以使用不带参数的DataRowCollection.Add来添加多行:

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

4
在你的for循环中(显然需要使用for循环来添加多行),你想要使用:
for(int i = 0; i < n; i++)
    table.Rows.Add();   

如果你知道想要在行中放置的内容,你可以修改以下代码:
DataRow newBlankRow = theDataTable.NewRow();
theDataTable.Rows.InsertAt(newBlankRow, theDataTable.Rows.Count);

1
对于有大量行的表,更好的解决方案是使用“表预制品”。 让我们看一个例子。 我们需要更新目标(DST)表的100k行。我们有外部源(SRC)表。我们知道SRC中的某些行可能不存在,这意味着该特定行的列为DBNULL。 如果我们只是将SRC合并到DST中,旧数据仍将存在于DST中。因此,为了清除该数据,我们需要首先清除从SRC导入数据的列中的所有数据,并保存另一些数据(实际上是从另一个源表中获取的数据)。
使用“For…Next”不是首选方法-太耗时间了。 接下来我会做以下操作:
1.创建临时表(TMP),其中唯一的列由与DST.PriaryKey匹配的PrimaryKey组成(尚未有任何行)。 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接