使用事务和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的字段有严格的要求,其实也可以与数据库表中的字段名不一样,但这样就需要具体指出表之间的对应关系。

 DataTable table = new DataTable();
table.Columns.AddRange(new DataColumn[]{
new DataColumn("flow_id",typeof(int)),
new DataColumn("sheet_no",typeof(string)),
new DataColumn("item_no",typeof(string)),
new DataColumn("unit_no",typeof(string)),
new DataColumn("unit_factor",typeof(string)),
new DataColumn("in_price",typeof(string)),
new DataColumn("order_qnty",typeof(string)),
new DataColumn("sub_amount",typeof(string)),
new DataColumn("real_qty",typeof(string)),
new DataColumn("tax_rate",typeof(string)),
new DataColumn("pay_percent",typeof(string)),
new DataColumn("out_qty",typeof(string))});
for (int i = ; i < dt.Rows.Count; i++)
{
DataRow r = dt.Rows[i];
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"]); } //开始数据保存逻辑 using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open(); SqlTransaction tran = conn.BeginTransaction();//开启事务 //在插入数据的同时检查约束,如果发生错误调用sqlbulkTransaction事务 SqlBulkCopy bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.CheckConstraints, tran);
bulkCopy.DestinationTableName = "***";//***代表要插入数据的表名
foreach (DataColumn dc in table.Columns) //传入上述table
{
bulkCopy.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);//将table中的列与数据库表这的列一一对应
} try
{
bulkCopy.WriteToServer(table);
tran.Commit();
}
catch (Exception ex)
{
tran.Rollback();
}
finally
{
bulkCopy.Close();
conn.Close();
}

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

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

 DataTable _DT = new DataTable();
_DT.Columns.Add("ID", Type.GetType("System.Int32"));
_DT.Columns.Add("Name", Type.GetType("System.String")); DataRow dataRow = _DT.NewRow();
dataRow[] = ;
dataRow[] = "姓名"; _DT.Rows.Add(dataRow);

这样自增ID就会自增了

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

 //自增列重新生成:SqlBulkCopy bc = new SqlBulkCopy(conn)
//自增列保留原值:SqlBulkCopy bc = new SqlBulkCopy(conn,SqlBulkCopyOptions.KeepIdentity)
using(SqlBulkCopy sbc = new SqlBulkCopy(conn,SqlBulkCopyOptions.KeepIdentity))
{
sbc.DestinationTableName = tableName;
foreach (string col in colList)
{
sbc.ColumnMappings.Add(col, col);
}
sbc.BulkCopyTimeout = ;
sbc.WriteToServer(dt);
}

【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. 成都Uber优步司机奖励政策(3月22日)

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

  2. 成都Uber优步司机奖励政策(1月10日)

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

  3. 7、Java并发编程:深入剖析ThreadLocal

    Java并发编程:深入剖析ThreadLocal 想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理.首先,本文先谈一下对ThreadLoc ...

  4. 新版本Eclipse安装后插件都在哪里?

    201903版本的Eclipse,选择win安装,下载后的安装包大小只有48.7Mb, 双击安装会会弹出类似eclipse网页,选择需要安装的类型,一般选择Java EE版本 选择好版本后,选择安装目 ...

  5. hadoop 家族图

    hadoop家族

  6. vim程序员加强功能

    1.折叠      1.1折叠的方式有六种           manual:以标准的vim结构定义折叠跨越的范围,类似移动命令           indent:折叠与折叠的层次,对应于文本的缩排与 ...

  7. 「日常训练」Battle Over Cities - Hard Version(PAT-TOP-1001)

    题意与分析 题意真的很简单,实在不想讲了,简单说下做法吧. 枚举删除每个点,然后求最小生成树,如果这个路已经存在那么边权就是0,否则按照原来的处理,之后求花费,然后判整个图是否联通(并查集有几个roo ...

  8. hdu6027Easy Summation(快速幂取模)

    Easy Summation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  9. Selenium自动化测试第一天(上)

    如有任何学习问题,可以添加作者微信:lockingfree 目录 Selenium自动化测试基础 Selenium自动化测试第一天(上) Selenium自动化测试第一天(下) Selenium自动化 ...

  10. Unity编辑器 - Rigidbody动力学Bake到AnimationClip

    Unity编辑器 - Rigidbody动力学Bake到AnimationClip Unity文档移动平台优化部分提到Physics对CPU的消耗较大 将动力学的特效如破碎等Bake成动画也是优化性能 ...