【发布时间】:2014-12-26 14:03:38
【问题描述】:
是否可以通过一次调用向 DataTable 添加几行?
问题是我需要创建一个 DataTable,其中每列在写入 DataTable 之前都需要进行先前的处理。逐行写会很不方便。
即,我需要创建一个包含 N 个空行的 DataTable,然后以列为基础写入值。
【问题讨论】:
-
是的,我知道可以通过循环来完成。我正在寻找一个更“优雅”的解决方案,即没有循环。所以似乎不可能。
是否可以通过一次调用向 DataTable 添加几行?
问题是我需要创建一个 DataTable,其中每列在写入 DataTable 之前都需要进行先前的处理。逐行写会很不方便。
即,我需要创建一个包含 N 个空行的 DataTable,然后以列为基础写入值。
【问题讨论】:
您不能在没有循环的情况下添加多行。如果您想将 n 行添加到所有列均为“空”的 DataTable,请使用不带参数的 DataRowCollection.Add:
for(int i = 0; i < n; i++)
table.Rows.Add(); // all fields get their default value
【讨论】:
在你的for循环中,(显然需要一个forloop来添加多行),你想使用
for(int i = 0; i < n; i++)
table.Rows.Add();
如果您知道要在行中放入什么,则可以调整此代码:
DataRow newBlankRow = theDataTable.NewRow();
theDataTable.Rows.InsertAt(newBlankRow, theDataTable.Rows.Count);
【讨论】:
对于有很多行的表格,更好的解决方案是使用“表格预制件”。 让我们看一个例子。 我们需要更新目标 (DST) 表的 100k 行。我们有外部源(SRC)表。我们知道 SRC 中的某些行可能不存在,这意味着该特定行的列是 DBNULL。 如果我们只是将 SRC 合并到 DST,那么旧数据仍然会在 DST 中。因此,为了清除这些数据,我们首先需要清除将从 SRC 导入数据的列中的所有数据,并保存另一个数据(实际上是从另一个源表中获取的)。
不推荐使用“For...Next” - 需要太多时间。 接下来我会做:
这是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
【讨论】: