BulkCopy位于System.Data.SqlClient命名空间,允许你使用其他源的数据有效地批量加载 SQL Server 表。

  属性:

BatchSize :每个批处理中的行数。 在每个批处理结束时,批处理中的行将发送到服务器。

BulkCopyTimeout:超时之前可用于完成操作的秒数。

ColumnMappings:返回 SqlBulkCopyColumnMapping 项的集合。 列映射定义数据源中的列和目标中的列之间的关系。

DestinationTableName:服务器上的目标表的名称。

EnableStreaming:启用或禁用 SqlBulkCopy 对象,以流式传输 IDataReader 对象中的数据。

NotifyAfter:定义生成通知事件之前要处理的行数。

  今天测试了一下BulkCopy的速度,100W的数据量存储在List<T>中,把List转化成Datatable后使用BulkCopy批量添加,总平均时间仅为7.5秒。以下是使用方式。

  1.首先是数据库操作方法

  1. /// <summary>
  2. /// 批量添加
  3. /// </summary>
  4. /// <param name="sqlBulkCopyColumnMappings">缓存数据表DataTable的列与SQL Server数据表列的映射关系</param>
  5. /// <param name="dataTable">缓存数据表DataTable</param>
  6. public static void SqlBulkCopy(List<SqlBulkCopyColumnMapping> sqlBulkCopyColumnMappings, DataTable dataTable)
  7. {
  8. using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(datalink.ConnectionString))
  9. {
  10. sqlBulkCopy.DestinationTableName = "Student";
  11. sqlBulkCopy.BatchSize = ;
  12. foreach (var item in sqlBulkCopyColumnMappings)
  13. {
  14. sqlBulkCopy.ColumnMappings.Add(item.SourceColumn, item.DestinationColumn);
  15. }
  16.  
  17. sqlBulkCopy.WriteToServer(dataTable);
  18. }
  19. }

  说明:如果模型类Model与数据表字段一一对应,第一个参数sqlBulkCopyColumnMappings使用空构造方法创建一个即可。由于这是Student表的数据库操作类,所以DestinationTableName直接赋值Student。

  2.可能需要以下辅助类,把List数据转化成DataTable

  1. /// <summary>
  2. /// List集合转换成DataTable
  3. /// </summary>
  4. /// <param name="list"></param>
  5. /// <returns></returns>
  6. public static DataTable ListToDataTable(IList list)
  7. {
  8. DataTable result = new DataTable();
  9. if (list.Count > )
  10. {
  11. PropertyInfo[] propertys = list[].GetType().GetProperties();
  12. foreach (PropertyInfo pi in propertys)
  13. {
  14. //获取类型
  15. Type colType = pi.PropertyType;
  16. //当类型为Nullable<>时
  17. if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable<>)))
  18. {
  19. colType = colType.GetGenericArguments()[];
  20. }
  21. result.Columns.Add(pi.Name, colType);
  22. }
  23. for (int i = ; i < list.Count; i++)
  24. {
  25. ArrayList tempList = new ArrayList();
  26. foreach (PropertyInfo pi in propertys)
  27. {
  28. object obj = pi.GetValue(list[i], null);
  29. tempList.Add(obj);
  30. }
  31. object[] array = tempList.ToArray();
  32. result.LoadDataRow(array, true);
  33. }
  34. }
  35. return result;
  36. }

ADO.NET批量添加数据到SQL Server—BulkCopy使用指南的更多相关文章

  1. ADO.NET- 中批量添加数据的几种实现方法比较

    在.Net中经常会遇到批量添加数据,如将Excel中的数据导入数据库,直接在DataGridView控件中添加数据再保存到数据库等等. 方法一:一条一条循环添加 通常我们的第一反应是采用for或for ...

  2. .Net中批量添加数据的几种实现方法比较

    在.Net中经常会遇到批量添加数据,如将Excel中的数据导入数据库,直接在DataGridView控件中添加数据再保存到数据库等等. 方法一:一条一条循环添加 通常我们的第一反应是采用for或for ...

  3. EF批量添加数据性能慢的问题的解决方案

    //EF批量添加数据性能慢的问题的解决方案 public ActionResult BatchAdd() { using (var db = new ToneRoad.CEA.DbContext.Db ...

  4. Excel表数据导入Sql Server数据库中

    Excel表数据导入Sql Server数据库的方法很多,这里只是介绍了其中一种: 1.首先,我们要先在test数据库中新建一个my_test表,该表具有三个字段tid int类型, tname nv ...

  5. Yii2如何批量添加数据

    批量添加这个操作,在实际开发中经常用得到,今天小编抽空给大家整理些有关yii2批量添加的问题,感兴趣的朋友一起看看吧. 在上篇文章给大家介绍了关于浅析Yii2 gridview实现批量删除教程,当然, ...

  6. 使用Spark加载数据到SQL Server列存储表

    原文地址https://devblogs.microsoft.com/azure-sql/partitioning-on-spark-fast-loading-clustered-columnstor ...

  7. Excel导入数据到Sql server 中出错:“文本被截断,或者一个或多个字符在目标代码页中没有匹配项”

    从Excel导入数据到Sql server 时,由于表中的数据有的很长,导入时出现如下错误(如果数据不是很长,255内以内,则不会出现错误): 出错原因: SQL Server的导入导出为了确定数据表 ...

  8. 极限挑战—C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码)

    原文:极限挑战-C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码) 实际工作中有时候需要把大量数据导入数据库,然后用于各种程序计算,本实验将使用5中方法完成这个过程,并详细记录各种方 ...

  9. 将DataTable 数据插入 SQL SERVER 数据库

    原文:将DataTable 数据插入 SQL SERVER 数据库 以下提供3中方式将DataTable中的数据插入到SQL SERVER 数据库: 一:使用sqlcommand.executenon ...

随机推荐

  1. C# mysql 连接Apache Doris

    前提:  安装mysql odbc驱动程序,目前只不支持8.0的最新版本驱动,个人使用的是5.1.12的驱动(不支持5.2以上版本),下载地址为: x64: https://cdn.mysql.com ...

  2. mysql修复表

    数据库Table xxx is marked as crashed and should be repaired错误的解决方法服务器断电等原因可能导致数据表损坏,导致访问的时候提示:Table xxx ...

  3. opencv_traincascade 训练自己的检测器

    2013年08月08日 ⁄ 综合 ⁄ 共 1061字 ⁄ 字号 小 中 大 ⁄ 评论关闭   经过近一个月的工程实战,把自己累积的经验分享给大家,教你如何训练一个收敛的,比opencv自带的data效 ...

  4. MVC-READ1

    将具有不同稳定性的元素融为一体,具有最差稳定性的元素决定了整体的稳定性,这是“短板理论”在软件设计中的体现. MVC的创建者是Trygve M. H. Reenskau,他是挪威的计算机专家,同时也是 ...

  5. Excel数据转化为sql脚本

    在实际项目开发中,有时会遇到客户让我们把大量Excel数据导入数据库的情况.这时我们就可以通过将Excel数据转化为sql脚本来批量导入数据库. 1 在数据前插入一列单元格,用来拼写sql语句. 具体 ...

  6. editplus 链接FTP失败,超时

    最近在用editplus链接服务器是出现了超时连接不上的情况 检查后发现FTP配置没问题 后来打开高级设置后发现没有配置端口号 配置后登陆成功

  7. 【mysql数据库】一条语句添加多条数据

    insert into persons (id_p, lastname , firstName, city ) values (200,'haha' , 'deng' , 'shenzhen'), ( ...

  8. Android 建立Menu选单&&onOptionsItemSelected (转)

    /** 当Menu有命令被选择时,会调用此方法 */ @Override public boolean onOptionsItemSelected(MenuItem item) { switch (i ...

  9. Volley的简单封装

    算了一下,好像有很久没有写博客了.其实,关于写博客这件事,我从来没有把他当成我的一种任务,而是在学习过程中的一种总结和自我发现,同样也是为了练一练文笔,说不定有一天,我也能出一本书像<第一行代码 ...

  10. mysql查询大于X分钟数

    select * from table where   date_add(STR_TO_DATE(createtime,'%Y-%m-%d %T:%i:%s'), interval '00:60:00 ...