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 大批量导入数据 问题解决的更多相关文章

  1. 意外发现的大批量导入数据SqlBulkCopy类

    因为要做一个号码归属地查询小功能,因为要导入外部(文本文件)的电话归属地数据,使用的是SqlDataAdapter类,数据不多,只四万有多条,表也只有一个,phoneBook表,使用的是DataTab ...

  2. 大批量导入数据的SqlBulkCopy类

     SqlBulkCopy 这个类用于数据库大批量的数据传递,通常用于新旧数据库之间的更新.关键的一点是,即使表结构不同,也可以通过表字段或者字段位置建立映射关系,将所需的数据导入到目标数据库. 下面代 ...

  3. Excel大批量导入数据到SQLServer数据库-万条只用1秒

    private string ExcelToStudent() { /*---*/ var preStr = DateTime.Now.ToString("yyyyMMddHHmmssfff ...

  4. SqlBulkCopy 批量导入数据 转换表字段类型

    在使用SqlBulkCopy导入数据时,要有一个跟数据库里面同样的DataTable 要赋值表名 要求每个列跟数据库中列同名,并且列的类型要赋值跟数据库中列的类型对应的NET类型 要求数据库中为Nul ...

  5. Java不写文件,LOAD DATA LOCAL INFILE大批量导入数据到MySQL的实现(转)

    MySQL使用load data local infile 从文件中导入数据比insert语句要快,MySQL文档上说要快20倍左右.但是这个方法有个缺点,就是导入数据之前,必须要有文件,也就是说从文 ...

  6. Linux下通过txt文件导入数据到MySQL数据库

    1.修改配置文件 在 /etc/my.conf 中添加 local_infile=1 2.重启MySQL >service mysqld restart 3.登录数据库 登录时添加参数 --lo ...

  7. 使用BCP批量导入数据

    本文原创,转载请标明出处 BCP 工具的使用 The bulk copy program utility (bcp) bulk copies data between an instance of M ...

  8. Solr7.x学习(4)-导入数据

    导入配置可参考官网:http://lucene.apache.org/solr/guide,http://lucene.apache.org/solr/guide/7_7/ 1.数据准备(MySQL8 ...

  9. C# SqlBulkCopy类批量导入数据

    特别注意  sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName); 插入的时候列的顺序可 ...

随机推荐

  1. win10编写8086汇编程序(dosbox)

    有部分同学反馈.在使用edit命令来编写汇编程序时遇到问题,由于模拟器没有edit程序,所以要换一种方式编写源程序.下面是完整的演示. 视频链接:http://www.bilibili.com/vid ...

  2. idea多行注释缩进

    选中多行代码 - 按下tab键——向后整体移动 选中多行代码 - 按下shift + tab键——向前整体缩进(整体去掉代码前面的空格)

  3. 100 IncDec序列

    IncDec序列 Description 给定一个长度为 n 的数列 a1,a2,-,an,每次可以选择一个区间 [l,r],使下标在这个区间内的数都加一或者都减一. 求至少需要多少次操作才能使数列中 ...

  4. python对excel表格进行操作

    python 对 EXCEL 进行操作 背景:对excel表格中某一列进行base 64解码操作,由于数据量比较庞大,就考虑用Python代码完成. 首先,分析整个文件操作中分为三步,第一步,对需要解 ...

  5. 本地启oracle实例服务无法重启,协议适配器错误

    今天遇到一位朋友的oracle实例服务无法起来,启动时报错: 分析的原因是可能早上服务器突然断电造成的,经过对tns的测试 经过我们讨论和诊断,最后诊断的处理方法是将实例删了重装,处理后服务恢复正常: ...

  6. NGUI的HUD Text的扩展插件学习--(HUDText)的使用

    一,我们先添加一个空的游戏对象,在菜单中找到这个添加空的游戏对象 二,然后我们给该对象添加HUDText,然后给这个添加字体 三,我们添加个脚本,代码如下: using UnityEngine; us ...

  7. [书接上一回]在Oracle Enterprise Linux (v5.7) 中安装DB - (1/4)

    在上一回中,我们安装了OEL了,现在就要安装Oracle数据. 首先登录root用户,输入账号密码或,输入命令行:startx,启动图形界面. 先将虚拟机中插入光碟(Enterprise-R5-U7- ...

  8. linux 验证 NFS 是否成功

    服务器端----->>客户端 1. 服务器端 [root@allentuns ~]# ifconfig |grep "Bcast" inet addr:192.168. ...

  9. 一、touch.js

    一.touch.js 1.引用链接: <script src="https://cdn.bootcss.com/touchjs/0.2.14/touch.min.js"> ...

  10. Oracle 索引数据字典、基于函数的索引

    user_indexes 字典视图包含了索引名和唯一性, user_ind_columns视图包含了索引名.表名.以及列名 dba_indexes dba_ind_columns 同理 select ...