在c#中手动填充DataTable的最快方法

本文关键字:方法 DataTable 填充 | 更新日期: 2023-09-27 18:15:32

我想知道如果有人知道一个更快的方式来填写一个手动数据表,然后我做。

这是我得到的,我有一个大约1.7b个条目的列表。我想用一列尽可能快地填充这个条目到DataTable中。列表中的条目是这样的{"A2C","DDF","ER","SQ","8G"}

我的代码需要大约7-8秒

for (int i = 0; i <= lists.Count; i++)
{
    table_list.Rows.Add();
}
for (int a = 0; a < list.Count; a++)
{
    table_list.Rows[a][0] = list[a][0] + list[a][1] + 
        list[a][2] + list[a][3] + list[a][4];
}

因为我没有发现任何类似的问题在板(只是关于如何填写sql和填充方法的问题),我决定张贴我的问题。

任何输入是高度赞赏!

在c#中手动填充DataTable的最快方法

我添加这个数据表到一个sql server数据库(我这样做的SqlBulkCopy)

这是一个错误;DataTable是纯粹的开销。你应该在这些数据上暴露一个IDataReader。这个API有点棘手,但是FastMember使它变得更容易。例如,听起来你有1列;所以考虑:

class Foo {
    public string ColumnName {get;set;}
}

现在编写一个迭代器块方法,将其从原始列表转换为每项:

IEnumerable<Foo> Convert(List<TheOldType> list) {
    foreach(var row in list) {
        yield return new Foo { ColumnName = /* TODO */ };
    }
}

,现在通过FastMember在惰性序列之上创建一个IDataReader:

List<TheOldType> list
var data = Convert(list);
using(var bcp = new SqlBulkCopy(connection))
using(var reader = ObjectReader.Create(data, "ColumnName"))
{
    bcp.DestinationTableName = "SomeTable";
    bcp.WriteToServer(reader);
}

这比填充DataTable要好得多——特别是,它避免了填充一个巨大的DataTable。强调:以上是假脱机 -没有缓冲

为什么先创建一个空行,然后再次循环该表来填充它们?

我会使用简单的foreach:

var table_list = new DataTable();
table_list.Columns.Add();
foreach(string[] fields in lists)
{
    DataRow newRow = table_list.Rows.Add();
    newRow.SetField(0, string.Join("", fields));
}

你为什么把所有的东西放在一个字段里?

为什么不使用DataTableLoadDataRow方法

// turnoff notifications
table_list.BeginLoadData();
// load each row into the table
foreach(string[] fields in lists)
    table_list.LoadDataRow(new object[] { string.Join("", fields) }, false);
// turn notifications back on
table_list.EndLoadData();

参见:DataTable。LoadDataRow方法 http://msdn.microsoft.com/en-us/library/kcy03ww2(v=vs.110).aspx