【C#】 List类型存储大量数据时,使用 SqlBulkCopy 以提高性能

序言

在大多数情况下,使用List类型时,
会通过 "SqlBulkCopy "将数据保存到数据库。

也可以一次插入一条记录,但处理大量数据需要时间,因此 "SqlBulkCopy "是您需要记住的一种方法。

 

使用SqlBulkCopy时的准备

使用 SqlBulkCopy 的步骤如下。

将列表转换为数据表
使用 SqlBulkCopy.WriteToServer 保存它
这似乎很容易做到。

将List转换为Table

public static DataTable ToDataTable(this List data)
{
  var properties = TypeDescriptor.GetProperties(typeof(T));
  var table = new DataTable();
  foreach(PropertyDescriptor prop in properties)
  {
    table.Columns.Aadd(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
  }  
  foreach(T item in data)  
  {
    var row = table.NewRow();
    foreach(PropertyDescriptor prop in properties)
    {
      row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
      table.Rows.Add(row);
    }
  }
  return table;

顺便提一下,如果 List 类型的属性名称与表格的列名称不同,则必须重新设置 Datatable 中的列。

List infoList = new List()
{
  id = 1, infoName = “test”
}

DataTable table = new Datatable(“SampleTable”);
table.Columns.Add(new Datacolumn(“id”,typeof(int)));
table.Columns.Add(new Datacolumn(“name”,typeof(string)));

foreach(Info target in infoList)
{
  table.Rows.Add(target.id, target.infoName);

通过SqlBulkCoppy.WriteToServer进行数据保存

string connectionString = “Data Source=SampleDB\\SQLExPRESS;Initial Catalog=SampleTable;User ID=sa;Password=P@ssw0rd”;

using(SqlBulkCopy bulkCopy = new SqlBulkCopy(connecttionS))
{
  bulkCopy.BulkCopyTimeout = 600;
  bulkCopy.DestinationTableName = “SampleTable”;
  bulkCopy.WriteToServer(table);
}

在运行时,当一个事务被t提交时,会出现错误信息 "Existing transaction is unexpected."。 的错误信息,可以使用

connection.Open();
using(var tran = connection.BeginTransaction(IsolationLevel.ReadCommitted))
{
  using(SqlBulkCopy bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, tran))
  {
    bulkCopy.BulkCopyTimeout = 600;
    bulkCopy.DestinationTableName = “SampleTable”;
    bulkCopy.WrieToServer(table);
  }
  tran.Commit();
}

总结

可以实现SqlBulkCopy 了。
当使用大量数据时,最好使用 SqlBulkCopy,但当数据量较小时,最好使用 Insert。
根据不同的使用情况使用不同的方法。