最近公司需要优化导入的问题,由于之前使用的方式是生成 Insert 语句插入数据库,数据量小的时候还行,但是随着发展数据量渐渐大了,之前的方法性能就跟不上了,于是发现了 SqlBulkCopy 这个类。

使用 SqlBulkCopy 类只能向 SQL Server 表写入数据。但是,数据源不限于 SQL Server;可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataReader 实例读取数据。

public class Conn{private static string StrConn{get{return ConfigurationManager.ConnectionStrings["StrConn"].ToString();//return ConfigurationManager.AppSettings["StrConn"].ToString();}}public static SqlConnection SqlConn{get{return new SqlConnection(StrConn);}}}public class SqlHelper{public DataTable GetDataTable(string sql){DataTable dt = new DataTable();SqlConnection conn = null;SqlDataAdapter sda = null;try{conn = Conn.SqlConn;sda = new SqlDataAdapter(sql, conn);conn.Open();sda.Fill(dt);}catch (Exception ex){}finally{if (conn != null){conn.Close();conn.Dispose();}if (sda != null){sda.Dispose();}}return dt;}public DataSet GetDataSet(string sql){DataSet ds = new DataSet();SqlConnection conn = null;SqlDataAdapter sda = null;try{conn = Conn.SqlConn;sda = new SqlDataAdapter(sql, conn);conn.Open();sda.Fill(ds);}catch (Exception ex){}finally{if (conn != null){conn.Close();conn.Dispose();}if (sda != null){sda.Dispose();}}return ds;}/// <summary>/// 使用事务插入方法/// </summary>/// <param name="dt">源数据</param>/// <param name="tableName">目标表名</param>public void InsertO(DataTable dt, string tableName){using (SqlConnection conn = Conn.SqlConn){using (SqlBulkCopy sqlBuleCopy = new SqlBulkCopy(conn.ConnectionString, SqlBulkCopyOptions.CheckConstraints | SqlBulkCopyOptions.Default | SqlBulkCopyOptions.UseInternalTransaction)){try{//设置目标表名,即数据库表名sqlBuleCopy.DestinationTableName = tableName;//设置每一批次的行数,即达到指定的行数就插入一次数据库sqlBuleCopy.BatchSize = 100000;//设置超时之前完成的时间(秒)sqlBuleCopy.BulkCopyTimeout = 3600;for (int i = 0; i < dt.Columns.Count; i++){//设置源数据列与目标表的列的映射关系,第一个参数为源数据列,第二个参数为目标表列sqlBuleCopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);}sqlBuleCopy.WriteToServer(dt);}catch (Exception){}}}}/// <summary>/// 未使用事务插入方法/// </summary>/// <param name="dt">源数据</param>/// <param name="tableName">目标表名</param>public void InsertT(DataTable dt, string tableName){using (SqlConnection conn = Conn.SqlConn){using (SqlBulkCopy sqlBuleCopy = new SqlBulkCopy(conn)){try{conn.Open();//设置目标表名,即数据库表名sqlBuleCopy.DestinationTableName = tableName;//设置每一批次的行数,即达到指定的行数就插入一次数据库sqlBuleCopy.BatchSize = 100000;//设置超时之前完成的时间(秒)sqlBuleCopy.BulkCopyTimeout = 3600;for (int i = 0; i < dt.Columns.Count; i++){//设置源数据列与目标表的列的映射关系,第一个参数为源数据列,第二个参数为目标表列sqlBuleCopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);}sqlBuleCopy.WriteToServer(dt);}catch (Exception){conn.Close();conn.Dispose();}finally{conn.Close();conn.Dispose();}}}}}

我的源数据是使用 Excel 导入的数据,导入的方法就不说了,不是这里的重点,之后我会专门总结一下 Excel 导入的方法。然后查询目标表需要插入数据的字段,修改源数据表的字段名和类型,然后调用批量插入的方法。

protected void btnImport_Click(object sender, EventArgs e){try{//获取导入的数据DataSet ds = BI.ExecleDs(savePath, "");if (ds != null && ds.Tables.Count > 0){DataTable dt = ds.Tables[0];//查询目标表需要插入的字段string sql = " select U_No,U_Name,U_Pwd,P_Id from UserInfo ";DataTable dt1 = sqlhelper.GetDataTable(sql);if (dt1 != null){for (int i = 0; i < dt1.Columns.Count; i++){//修改源数据表的字段类型和字段名称dt.Columns[i].DataType = dt1.Columns[i].DataType;dt.Columns[i].ColumnMapping = dt1.Columns[i].ColumnMapping;dt.Columns[i].ColumnName = dt1.Columns[i].ColumnName;}sqlhelper.InsertO(dt, "UserInfo");}}}catch (Exception ex){throw;}}

如果源数据表的列和目标表的列的顺序或列名不相同,那就必须使用 ColumnMappings.Add() 方法设置映射关系。

参考:

http://www.cnblogs.com/zfanlong1314/archive/2013/02/05/2892998.html

转载于:https://www.cnblogs.com/shanshanlaichi/p/6887935.html

C# 使用 SqlBulkCopy 类批量复制数据到数据库相关推荐

  1. 使用asp.net 2.0中的SqlBulkCopy类批量复制数据

    介绍: 在软件开发中,把数据从一个地方复制到另一个地方是一个普遍的应用. 在很多不同的场合都会执行这个操作,包括旧系统到新系统的移植,从不同的数据库备份数据和收集数据. ASP.NET 2.0有一个S ...

  2. 用.net中的SqlBulkCopy类批量复制数据 (转载)

    在软件开发中,把数据从一个地方复制到另一个地方是一个普遍的应用. 在很多不同的场合都会执行这个操作,包括旧系统到新系统的移植,从不同的数据库备份数据和收集数据. .NET 2.0有一个SqlBulkC ...

  3. sqlbulkcopy mysql_SqlBulkCopy 批量复制数据到数据库

    1.简介 核心方法:SqlBulkCopy.WriteToServer 将所有行从数据源复制到 SqlBulkCopy 对象的 DestinationTableName 属性指定的目标表中. 2.一句 ...

  4. .net2.0中SqlBulkCopy批量复制数据出错原因分析!

    在项目后台数据库选择SqlServer,进行批量复制数据时,.net2.0中提供的SqlBulkCopy不失为一个好的选择,性能相当可观;最近亲手实验一把,效果不错,大家可以参见http://www. ...

  5. SqlBulkCopy类进行大数据(一万条以上)插入测试

    SqlBulkCopy类进行大数据(一万条以上)插入测试 转载于:https://www.cnblogs.com/macT/p/10213882.html

  6. python加数据库_用python批量插入数据到数据库中

    既然使用python操作数据库必不可少的得使用pymysql模块 可使用两种方式进行下载安装: 1.使用pip方式下载安装 pip install pymysql 2.IDE方式 安装完成后就可以正常 ...

  7. mysql批量加逗号_批量插入数据到数据库的方式

    出于性能的考虑.用Insert语句一条一条的插入大量数据到数据库肯定不是最好的选择.指不定还会把数据库搞死了. 前几天,用户提了需求,要求写Job实现,每天清空一个Table,然后将新发过来的数据In ...

  8. SqlBulkCopy批量复制数据

    在.Net1.1中无论是对于批量插入整个DataTable中的所有数据到数据库中,还是进行不同数据源之间的迁移,都不是很方便.而 在.Net2.0中,SQLClient命名空间下增加了几个新类帮助我们 ...

  9. SqlBulkCopy 批量复制数据到数据表

    使用 SqlBulkCopy 类只能向 SQL Server 表写入数据.但是,数据源不限于 SQL Server:可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataR ...

最新文章

  1. IDEA创建方法时快速添加注释
  2. android记录登录状态
  3. Linux学习笔记03
  4. 专属微信二维码python制作_如何利用Python制作简单的公众号二维码关注图
  5. python (六)函数
  6. 【计蒜客 - 蓝桥训练】炮台实验(数学期望,期望dp)
  7. c语言中O空字符,OC语言中字符串的使用
  8. ICCV2021|面向城市场景理解的大规模3D点云挑战赛
  9. [转]苦逼男和女神之间的经典对话,亲身经历过的有木有啊,必须转。。。
  10. Android PM suspendresume
  11. 55)函数指针和其意义
  12. jquery on()方法off()方法
  13. 场景文字检测OD与字符识别OCR概述
  14. Unity3D Timeline 工作流
  15. 关于23届大数据岗实习总结
  16. mysql查看sa密码_查询mssql 密码
  17. 督查督办系统在企业能发挥哪些作用?
  18. ZOJ 2480 Simplest Task in Windows
  19. 计算机教师个人总结及自评,教师个人总结及自评
  20. 嵌入式简答试题及答案汇总

热门文章

  1. 链接与加载过程中,几个关键的概念
  2. JAVASCRIPT 基本数据类型
  3. 任丽萍跟我赌200块钱的
  4. Qt widgets deeps--烧鸡
  5. 用Qt写软件系列一:QCacheViewer(浏览器缓存查看器)
  6. Arcgis Engine 添加一个Symbol符号样式步骤
  7. ORA-02290:违反检查约束条件(sys_c0011321)什么原因
  8. 解析含有资源类型的字符串
  9. 清除所有多余的桌面右键菜单
  10. python实现get请求 模块_python爬虫 基于requests模块发起ajax的get请求实现解析