使用事务和SqlBulkCopy批量插入数据

SqlBulkCopy是.NET Framework 2.0新增的类,位于命名空间System.Data.SqlClient下,主要提供把其他数据源的数据有效批量的加载到SQL Server表中的功能。类似与 Microsoft SQL Server 包中名为 bcp 的命令行应用程序。但是使用 SqlBulkCopy 类可以编写托管代码解决方案,性能上优于bcp命令行应用程序,更优于如Insert方式向SQL Server表加载大量数据。SqlBulkCopy可以应用到大批量数据的转移上,而不管数据源是什么。

之前在做winform开发的时候,发现当datagridview数据量比较大的时候,用for循环非常耗时间与性能,通过查阅资料,了解到了SqlBulkCopy这种批量的数据转移工具。

下述代码实现了datagridview的批量数据插入。

如果datagridview的列与数据库中的表结构不能完全对应的话,我们需要先将datagridview数据存放到一个DataTable 中,注意DataTable 中的列需要与即将插入的表的列类型兼容,名称与列顺序完全一样。自增列随便填写一个int类型的值即可,也可不写,如果没给自增列指定值的话,在后续的表映射关系中需要明确指出对应关系。因为我这里是用循环来指定表对应关系的,所以对table的字段有严格的要求,其实也可以与数据库表中的字段名不一样,但这样就需要具体指出表之间的对应关系。

  1. DataTable table = new DataTable();
  2. table.Columns.AddRange(new DataColumn[]{
  3. new DataColumn("flow_id",typeof(int)),
  4. new DataColumn("sheet_no",typeof(string)),
  5. new DataColumn("item_no",typeof(string)),
  6. new DataColumn("unit_no",typeof(string)),
  7. new DataColumn("unit_factor",typeof(string)),
  8. new DataColumn("in_price",typeof(string)),
  9. new DataColumn("order_qnty",typeof(string)),
  10. new DataColumn("sub_amount",typeof(string)),
  11. new DataColumn("real_qty",typeof(string)),
  12. new DataColumn("tax_rate",typeof(string)),
  13. new DataColumn("pay_percent",typeof(string)),
  14. new DataColumn("out_qty",typeof(string))});
  15. for (int i = ; i < dt.Rows.Count; i++)
  16. {
  17. DataRow r = dt.Rows[i];
  18. table.Rows.Add(i, sheet_no, r["item_no"], r["unit_no"], r["unit_factor"], r["in_price"], r["order_qnty"], r["sub_amount"], r["real_qty"], r["tax_rate"], r["pay_percent"], r["out_qty"]);
  19.  
  20. }
  21.  
  22. //开始数据保存逻辑
  23.  
  24. using (SqlConnection conn = new SqlConnection(connectionString))
  25. {
  26. conn.Open();
  27.  
  28. SqlTransaction tran = conn.BeginTransaction();//开启事务
  29.  
  30. //在插入数据的同时检查约束,如果发生错误调用sqlbulkTransaction事务
  31.  
  32. SqlBulkCopy bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.CheckConstraints, tran);
  33. bulkCopy.DestinationTableName = "***";//***代表要插入数据的表名
  34. foreach (DataColumn dc in table.Columns) //传入上述table
  35. {
  36. bulkCopy.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);//将table中的列与数据库表这的列一一对应
  37. }
  38.  
  39. try
  40. {
  41. bulkCopy.WriteToServer(table);
  42. tran.Commit();
  43. }
  44. catch (Exception ex)
  45. {
  46. tran.Rollback();
  47. }
  48. finally
  49. {
  50. bulkCopy.Close();
  51. conn.Close();
  52. }

在将datable bulkcpy到数据库的时候,若没有指定第一列自增ID的话就会将下一列当成自增ID

其实用不着加bulk.ColumnMappings.Add("Name", "LastName");这样映射,只要把自增ID的column加到datatable即可

  1. DataTable _DT = new DataTable();
  2. _DT.Columns.Add("ID", Type.GetType("System.Int32"));
  3. _DT.Columns.Add("Name", Type.GetType("System.String"));
  4.  
  5. DataRow dataRow = _DT.NewRow();
  6. dataRow[] = ;
  7. dataRow[] = "姓名";
  8.  
  9. _DT.Rows.Add(dataRow);

这样自增ID就会自增了

SqlBulkCopy导入数据(自增列保留原值)

  1. //自增列重新生成:SqlBulkCopy bc = new SqlBulkCopy(conn)
  2. //自增列保留原值:SqlBulkCopy bc = new SqlBulkCopy(conn,SqlBulkCopyOptions.KeepIdentity)
  3. using(SqlBulkCopy sbc = new SqlBulkCopy(conn,SqlBulkCopyOptions.KeepIdentity))
  4. {
  5. sbc.DestinationTableName = tableName;
  6. foreach (string col in colList)
  7. {
  8. sbc.ColumnMappings.Add(col, col);
  9. }
  10. sbc.BulkCopyTimeout = ;
  11. sbc.WriteToServer(dt);
  12. }

【ADO.NET】SqlBulkCopy批量添加DataTable的更多相关文章

  1. SqlBulkCopy批量添加

    /// <summary> /// 添加数据 /// 注:DataTable列名必须和数据库列名一致 /// </summary> /// <returns>< ...

  2. SqlBulkCopy批量添加数据

    var sqlconn = ConfigurationManager.ConnectionStrings["SQLConnStringRead"].ConnectionString ...

  3. 【批量添加】-SqlBulkCopy语句 标签: sql批量添加 2015-12-20 14:39 1367人阅读 评论(33)

    上篇博客我们介绍了通过拼接sql字符串的方法来对sql数据库进行批量添加,但是通过语句拼接insert语句有个缺点,就是每次最多只能添加1000条.当时我们另外一个界面也用到了批量添加,但是这个界面轻 ...

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

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

  5. .net使用SqlBulkCopy类操作DataTable批量插入数据库数据,然后分页查询坑

    在使用SqlBulkCopy类操作DataTable批量插入数据,这种操作插入数据的效率很高,就会导致每一条数据在保存的时间基本一样,在我们分页查询添加的数据是,使用数据的添加时间来排序就会出现每页的 ...

  6. ado.net 批量添加 更新 删除

    自曾列就别往下看 别折腾了   使用 SqlBulkCopy ,dataTable 必须跟sql里面的表字段完全一样 下面在sqlserver中演示 mysql 请google MySqlBulkLo ...

  7. ADO.NET批量添加数据到SQL Server—BulkCopy使用指南

    BulkCopy位于System.Data.SqlClient命名空间,允许你使用其他源的数据有效地批量加载 SQL Server 表. 属性: BatchSize :每个批处理中的行数. 在每个批处 ...

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

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

  9. sql 中的Bulk和C# 中的SqlBulkCopy批量插入数据 ( 回顾 and 粗谈 )

    通常,我们会对于一个文本文件数据导入到数据库中,不多说,上代码. 首先,表结构如下.   其次,在我当前D盘中有个文本文件名为2.txt的文件. 在数据库中,可以这样通过一句代码插入. Bulk in ...

随机推荐

  1. struts2学习笔记二

    一.分文件编写框架配置文件 1.不分文件开发可能产生的问题 就类似于我们在写java类时,所有代码都写在一个类里,甚至写在一个方法里. 当3个人都checkout了struts.xml文件时,第一个人 ...

  2. python--基本类型之集合

    set(集合): 定义和创建: 定义:集合是一个无序的,不重复的数据集合,它主要作用1:去重,把一个列表变成集合,就自动去重了2:关系测试,测试两组数据之间的交集,差集,并集等关系 集合:把不同的数据 ...

  3. Canvas在移动端设备上模糊出现锯齿边

    在绘制的过程中画布内容的实际大小是根据 canvas 的 width 与 height 属性设置的,而 style 或者CSS设置的width 与 height 只是简单的对画布进行缩放. canva ...

  4. Java设计模式(4)——创建型模式之单例模式(Singleton)

    一.概述 弥补一下之前没有给设计模式下的定义,先介绍一下设计模式(引用自百度百科): 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 使用设计 ...

  5. Zookeeper原理和实战开发经典视频教程 百度云网盘下载

    Zookeeper原理和实战开发 经典视频教程 百度云网盘下载 资源下载地址:http://pan.baidu.com/s/1o7ZjPeM   密码:r5yf   

  6. BZOJ3224_普通平衡树_KEY

    题目传送门 平衡二叉树(Balanced Binary Tree)具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树.平衡二叉树的常用实现方法有红 ...

  7. 北京Uber优步司机奖励政策(4月5日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  8. PHP数组中插入元素

    1. array_unshift()数组头插入新元素 $fruits = array('apple','pear','banana','orange'); array_unshift($fruits, ...

  9. 2019年猪年海报PSD模板-第四部分

    14套精美猪年海报,免费猪年海报,下载地址:百度网盘,https://pan.baidu.com/s/1WUO4L5PHIHG5hAurv52_2A                        

  10. 在nginx环境下,直接用域名访问(首页)

    ①: server { listen 80; server_name www.njm1.com; location = / { #=/规则可以直接访问域名.如:www.njm1.com.跳转到http ...