IBatis.Net 下使用SqlBulkCopy 大批量导入数据 问题解决
SQLBulkCopy是继承SQLClient空间下的一个特殊类,它可以帮助我们以映射的方式把DataTable和DataReader数据大批量导入到数据库对应表中
public void Inert2DBBySqlBulkCopy(DataTable data, string tableName)
{
BaseDao basdd = new BaseDao();
using (SqlConnection conn = new SqlConnection(basdd.SqlNormMap.DataSource.ConnectionString))
{
if (conn.State != ConnectionState.Open)
conn.Open();
using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(conn))
{
sqlBulkCopy.ColumnMappings.Add(, "CarModelID");
sqlBulkCopy.ColumnMappings.Add(, "TranConfID");
sqlBulkCopy.ColumnMappings.Add(, "TranValue");
sqlBulkCopy.ColumnMappings.Add(, "CreatorID");
sqlBulkCopy.ColumnMappings.Add(, "Creator");
sqlBulkCopy.ColumnMappings.Add(, "OptDataType");
sqlBulkCopy.BatchSize = data.Rows.Count;
sqlBulkCopy.BulkCopyTimeout = ;
sqlBulkCopy.DestinationTableName = tableName;
sqlBulkCopy.WriteToServer(data);
}
if (conn.State != ConnectionState.Closed)
conn.Close();
}
}
其中要注意都是:
Table表中的字段名称,字段顺序,字段类型 必须和插入的sqlBulkCopy.ColumnMappings.Add的插入顺序是一模一样的,如下图,自定义一个Class
public class JJJModel
{
public int? CarModelID { get; set; }
public int TranConfID { get; set; }
public string TranValue { get; set; }
public int CreatorID { get; set; }
public string Creator { get; set; }
public int OptDataType { get; set; }
}
插入的时候的代码
//匹配款式Id和配置ID 拼成二维表数据
for (int i = ; i < listCarModelID.Count(); i++)
{
msindex = i;
for (int j = ; j < listTranF.Count(); j++)
{
JJJModel jj = new JJJModel();
jj.CarModelID = Convert.ToInt32(listCarModelID[i]); //款型ID
jj.TranConfID = Convert.ToInt32(listTranF[j].ToString()); //配置ID
jj.TranValue = dtCMTranConf.Rows[i][j + ].ToString().ToUpper();//值
jj.CreatorID = UserId;
jj.Creator = UserName;
jj.OptDataType = CarConst.OptDataType20;
listTranExcel.Add(jj);
}
}
异常信息:楼主刚开始写的时候也是按照上边开发,百万数据数据也是轻轻松松分分钟搞定的。可是后来,产品有提到一个要求,就是要大批量更新数据,而且也是速度很快的时间内完成。
解决SQLBulkCopy批量更新问题:
于是就想先删除 那些要插入的数据,再批量插入要更新的数据,于是乎就捋起胳膊大干一场,当然删除和批量插入肯定是同一张表(Table_A),也肯定是在同一个事务中,后来,后来竟然插入不成功,
就一直在sqlBulkCopy.WriteToServer(data);这句代码里边一直转悠,一直到sql连接超时结束调试程序。我就郁了个闷的,同样的代码怎么会出现这个问题。
后来仔细查看对比一下,原来问题是由于对同一个表(Table_A) 先删除,再批量插入的时候 都是在同一个事务中 ,因为删除的时候 就把表给lock了,当然只能插入失败了.
那怎么办呢,于是楼主就扔然 还让先删除,再插入 在同一个事务中,只是在数据做了个操作,建立一个同样和目标表(Table_A)一样的临时表(Table_Temp),在执行事务开始时候,
先把要插入的数据插入到临时表Table_Temp,然后执行存储过程,再存储过程中 删除目标表(Table_A)中的存在于临时表(Table_Temp)里边的ID条件数据.
然后再用Insert Into 目标表(Table_A) select from 临时表(Table_Temp) 的方法把临时表的数据插入到目标表(Table_A)中.这样就妥妥的完成了。
PS:存储过程中写个事务,完成不完成都要把临时表(Table_Temp)的数据清空哦 ,这个可不能忘记了
IBatis.Net 下使用SqlBulkCopy 大批量导入数据 问题解决的更多相关文章
- 意外发现的大批量导入数据SqlBulkCopy类
因为要做一个号码归属地查询小功能,因为要导入外部(文本文件)的电话归属地数据,使用的是SqlDataAdapter类,数据不多,只四万有多条,表也只有一个,phoneBook表,使用的是DataTab ...
- 大批量导入数据的SqlBulkCopy类
SqlBulkCopy 这个类用于数据库大批量的数据传递,通常用于新旧数据库之间的更新.关键的一点是,即使表结构不同,也可以通过表字段或者字段位置建立映射关系,将所需的数据导入到目标数据库. 下面代 ...
- Excel大批量导入数据到SQLServer数据库-万条只用1秒
private string ExcelToStudent() { /*---*/ var preStr = DateTime.Now.ToString("yyyyMMddHHmmssfff ...
- SqlBulkCopy 批量导入数据 转换表字段类型
在使用SqlBulkCopy导入数据时,要有一个跟数据库里面同样的DataTable 要赋值表名 要求每个列跟数据库中列同名,并且列的类型要赋值跟数据库中列的类型对应的NET类型 要求数据库中为Nul ...
- Java不写文件,LOAD DATA LOCAL INFILE大批量导入数据到MySQL的实现(转)
MySQL使用load data local infile 从文件中导入数据比insert语句要快,MySQL文档上说要快20倍左右.但是这个方法有个缺点,就是导入数据之前,必须要有文件,也就是说从文 ...
- Linux下通过txt文件导入数据到MySQL数据库
1.修改配置文件 在 /etc/my.conf 中添加 local_infile=1 2.重启MySQL >service mysqld restart 3.登录数据库 登录时添加参数 --lo ...
- 使用BCP批量导入数据
本文原创,转载请标明出处 BCP 工具的使用 The bulk copy program utility (bcp) bulk copies data between an instance of M ...
- Solr7.x学习(4)-导入数据
导入配置可参考官网:http://lucene.apache.org/solr/guide,http://lucene.apache.org/solr/guide/7_7/ 1.数据准备(MySQL8 ...
- C# SqlBulkCopy类批量导入数据
特别注意 sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName); 插入的时候列的顺序可 ...
随机推荐
- 【EWM系列】SAP EWM创建warehouse task的函数
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP EWM创建warehouse ...
- 请正视抑郁症(附Zung氏抑郁自评量表(SDS))
为什么要记录? 因为去年开始关注抑郁症这块,逐渐发现抑郁症原来不只是简单的情绪问题,它是情绪与实质性的生理相互作用并紧密关联的疾病,并不是单纯的劝解自己就可以疗愈的一种疾病,它的存在需要换着身边的人帮 ...
- 阅读笔记12-Java 面试题 —— 老田的蚂蚁金服面试经历
电话一面 1.自我介绍.自己做的项目和技术领域 2.项目中的监控:那个监控指标常见的哪些? 3.微服务涉及到的技术以及需要注意的问题有哪些? 4.注册中心你了解了哪些? 5.consul 的可靠性你了 ...
- 解决ajax跨域几种方式
发生跨域问题的原因: 浏览器的限制,出于安全考虑.前台可以正常访问后台,浏览器多管闲事报跨域问题,但其实前台已经访问到后台了. 跨域,协议.域名.端口任何一个不一样浏览器就认为是跨域. XHR(XML ...
- pycharm中的Terminal 中无法使用git的问题
1.先找到git的安装路径,建议使用Everything工具 2.打开pycharm中的setting > tools > Terminal 3.把git的安装路径加上启动文件 bash. ...
- GitHub Pages建立第一个静态页面
1.创建仓库 创建仓库点击右上角的加号,选择newrepository.然后对仓库信息进行设置.注意箭头标识的几个地方.仓库名必须是http://username.github.io的形式.必须勾选p ...
- [Python3 填坑] 008 索引君的朋友 in
目录 1. print( 坑的信息 ) 2. 开始填坑 (1) 前情提要 (2) 索引君的朋友 in 上线 (3) 既然说了 in,不妨再说一说 not in (4) 一些补充 1. print( 坑 ...
- (六:NIO系列) 相关设计模式
出处: 反应器模式 vs 观察者模式 反应器模式 vs 生产者消费者模式 反应器模式 vs 观察者模式 反应器模式 是一种为处理服务请求并发提交到一个或者多个服务处理程序的事件设计模式.当请求抵达 ...
- BUUCTF--rsa
测试文件:https://buuoj.cn/files/ed10ec009d5aab0050022aee131a7293/41c4e672-98c5-43e5-adf4-49d75db307e4.zi ...
- mysql安装,卸载; 库和表的基础操作
数据库 """ 1.什么是数据库:管理数据的系统 - 安装某种管理数据的系统 - 管理的对象本质是文件 2.存储数据的位置:内存.硬盘 3.什么是系统:运行在硬件基础上 ...