批量往数据库导入数据遇到的问题总结
2016-04-14 17:16
393 查看
项目开发中,有个功能需要往数据库批量插入数据,刚开始没考虑那么多,就一条一条数据循环插入数据库,数据量少的时候,效率还可以,但是当数据量达到上千甚至几百时,这个方法效率就不行了,得等段时间才全部插入成功,用户体验度非常不好,果断pass掉该方法。
接着换令一种方法,那就是拼接insert字符串,即"Insert into TableName Values(' ',' ',' '),(' ',' ',' ');",刚开始还比较happy,插入速度很快,效率很高,可是当数据过千后,问题出现了,报错了提示“INSERT 语句中行值表达式的数目超出了 1000 行值的最大允许值。”,我去,一次只能批量插入1000条数据,这也太坑了吧!要想继续用这种方法,就必须循环数据,每次插入1000条,这样得加各种判断比较繁琐,懒得加就继续pass。
就这样兜兜转转找到了第三种方法,使用SqlBulkCopy类批量添加数据,经过查资料发现这个方法真是NB,百万级的数据插入数据库只用了十几秒甚至几秒,这效率简直要上天呀!于是果断用这个方法。下面是SqlBulkCopy类的简单用法:
这个方法不仅效率快,而且数据源不限,只要将数据加载到DataTable实例或者DataRow数组中都可以将数据批量插入数据库。
就这样批量插入的问题愉快的解决了,以后再也不用担心上万级数据的批量插入效率问题了~~~
接着换令一种方法,那就是拼接insert字符串,即"Insert into TableName Values(' ',' ',' '),(' ',' ',' ');",刚开始还比较happy,插入速度很快,效率很高,可是当数据过千后,问题出现了,报错了提示“INSERT 语句中行值表达式的数目超出了 1000 行值的最大允许值。”,我去,一次只能批量插入1000条数据,这也太坑了吧!要想继续用这种方法,就必须循环数据,每次插入1000条,这样得加各种判断比较繁琐,懒得加就继续pass。
就这样兜兜转转找到了第三种方法,使用SqlBulkCopy类批量添加数据,经过查资料发现这个方法真是NB,百万级的数据插入数据库只用了十几秒甚至几秒,这效率简直要上天呀!于是果断用这个方法。下面是SqlBulkCopy类的简单用法:
public void BatchInsert(List<AdCarSerialEntity> list) { DataTable dt = DataFormat.ListToDataTable<AdCarSerialEntity>(list); using (SqlBulkCopy bulkCopy = new SqlBulkCopy(WebConfig.DealerRW, SqlBulkCopyOptions.KeepIdentity)) { //每一批次中的行数 bulkCopy.BatchSize = 100000; //超时之前操作完成所允许的秒数 bulkCopy.BulkCopyTimeout = 1800; //将DataTable表名作为待导入库中的目标表名 bulkCopy.DestinationTableName = "AdCarSerials"; //将数据集合和目标服务器库表中的字段对应 for (int i = 1; i < dt.Columns.Count; i++) { //列映射定义数据源中的列和目标表中的列之间的关系 bulkCopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName); } //将DataTable数据上传到数据表中 bulkCopy.WriteToServer(dt); } }
这个方法不仅效率快,而且数据源不限,只要将数据加载到DataTable实例或者DataRow数组中都可以将数据批量插入数据库。
就这样批量插入的问题愉快的解决了,以后再也不用担心上万级数据的批量插入效率问题了~~~
相关文章推荐
- PostgreSQL wiki
- Oracle-11-主键约束
- oracle中CAST函数使用简介
- mysql 对取当前日期周一和周日语句的详细解析
- sql入门1
- [MySQL]快速解决"is marked as crashed and should be repaired"故障
- MySQL存储引擎中的MyISAM和InnoDB区别详解
- Java操作Memcached
- MySQL死锁分析
- BIG biang教你误删oracle 怎么办,
- Mysql-5.7.11-winx64免安装的配置方法
- Windows下MySQL 5.6安装及配置详细图解(大图版)
- Oracle疑问_20160414
- MySQL数据库引擎详解
- 如何使用脚本自动备份阿里云rds数据库
- TimesTen 应用层数据库缓存学习:6. Aging策略
- TimesTen 应用层数据库缓存学习:5. 异步读写缓存
- 判断sql是否存在特定的对象
- redis学习日志【二、redis+jedis】
- SQL语言的四种类型