使用SqlBulkCopy比使用DataTable有更快的方法吗?

Nib*_*Pig 1 c# sql-server sqlbulkcopy

我将大量记录加载到我的应用程序中(100万+)并对它们进行大量处理.处理要求它们都在内存中.

之后,我想将所有(现在已修改的)记录转储到空表中.

加载记录只需几秒钟,我最终得到了大量的MyRecord项目.

节省使用也SqlBulkCopy需要几秒钟.

但是SqlBulkCopy需要(我相信)a DataTable- 并将我的记录加载到一个DataTable缓慢的 - 每分钟约7500条记录使用

dataTable.Rows.Add(myRecord.Name, myRecord.Age, ....)
Run Code Online (Sandbox Code Playgroud)

有没有更快的方法来执行这个中间步骤?

Pan*_*vos 9

导致延迟是因为您必须先将所有内容缓冲到DataTable中,然后再将其发送到服务器.为了获得更好的性能,您应该立即将记录发送到SqlBulkCopy,并让该类使用自己的缓冲和批处理.

SqlBulkCopy可以与IDataReader一起使用.所有ADO.NET数据读取器都实现此接口,因此您可以将从任何数据读取器读取的数据推送到SqlBulkCopy.

在其他情况下,假设您有一个IEnumerable对象,您可以使用FastMember包中的Marc Gravel的ObjectReader 在IEnumerable之上创建一个IDataReader.该数据读取器并不会立刻加载的一切,所以没有数据缓存,直到SqlBulkCopy的要求它:

复制Marc Gravel的例子:

IEnumerable<SomeType> data = ... 

using(var bcp = new SqlBulkCopy(connection)) 
using(var reader = ObjectReader.Create(data, "Id", "Name", "Description")) 
{ 
  bcp.DestinationTableName = "SomeTable"; 
  bcp.WriteToServer(reader); 
}
Run Code Online (Sandbox Code Playgroud)