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(0, "CarModelID"); sqlBulkCopy.ColumnMappings.Add(1, "TranConfID"); sqlBulkCopy.ColumnMappings.Add(2, "TranValue"); sqlBulkCopy.ColumnMappings.Add(3, "CreatorID"); sqlBulkCopy.ColumnMappings.Add(4, "Creator"); sqlBulkCopy.ColumnMappings.Add(5, "OptDataType"); sqlBulkCopy.BatchSize = data.Rows.Count; sqlBulkCopy.BulkCopyTimeout = 30; 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 = 0; i < listCarModelID.Count(); i++)
{
    msindex = i;
    for (int j = 0; 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 + 2].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)的数据清空哦 ,这个可不能忘记了

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索string
, int
, 数据
, 存储过程
, 事务
代码
,以便于您获取更多的相关知识。

时间: 2024-09-20 05:53:50

IBatis.Net如何使用SqlBulkCopy大批量导入数据的相关文章

使用BULK INSERT大批量导入数据 SQLSERVER_MsSql

开门见山,直接以例子介绍: 复制代码 代码如下: CREATE TABLE [dbo].[course]( [id] [int] NULL, [name] [nvarchar](50) NULL, [CourseType] [nvarchar](50) NULL, [Course] [float] NULL ) 导入数据: 将下面的数据存储为文本文件或SQL文件 2,李刚,语文,89;3,李刚,数学,79;3,李刚,英语,69;4,李刚,化学,89 导入语句: 复制代码 代码如下: BULK I

mssqlserver中BULK INSERT大批量导入数据 SQL SERVER

开门见山,直接以例子介绍:  代码如下 复制代码 CREATE TABLE [dbo].[course]( [id] [int] NULL, [name] [nvarchar](50) NULL, [CourseType] [nvarchar](50) NULL, [Course] [float] NULL ) 导入数据: 将下面的数据存储为文本文件或SQL文件 2,李刚,语文,89;3,李刚,数学,79;3,李刚,英语,69;4,李刚,化学,89   导入语句:  代码如下 复制代码 BULK

使用SqlBulkCopy导入数据至MS SQL Server

原文:使用SqlBulkCopy导入数据至MS SQL Server Insus.NET一直使用表类型来数据入MS SQL Server.参考<存储过程参数为DataTable>http://www.cnblogs.com/insus/archive/2012/09/22/2698515.html .今天学习一个SqlBulkCopy来把数据导入MS SQL Server中去.就是这个<读取XML某一节点>http://www.cnblogs.com/insus/p/3778256

关于批量导入数据类SqlBulkCopy 导入数据时增加额外的列

问题描述 usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Diagnostics;usingSystem.Data.SqlClient;usingSystem.Data;namespace样本采购订单{classProgram{staticvoidMain(string[]args){Stopwatchst=newStopwatch();st.Start();str

C#实现Excel导入数据到SQL的功能中关于小数的问题

问题描述 近日,要在c#中实现Excel导入数据到sql数据库的功能,已实现可以导入,只是其中的小数,总是会减少,比如Excel中数据是2.010,导入到数据库中之后就会变成2.009这样,请问有谁知道是什么原因吗?在导入之前已经把Excel中的这列小数设置成文本格式了.导入之前的数据:导入之后的数据:导入数据的功能是这样实现的,先把Excel中的数据读取到DataTable中,然后用sbc的插入到数据库中代码分别如下:///<summary>///Excel导入数据源///</summ

Rafy 框架 - 大批量导入实体

某些场景下,开发者希望能够大批量地把实体的数据导入到数据库中.虽然使用实体仓库保存实体列表非常方便,但是其内部实现机制是一条一条的保存到数据库,当实体的个数较多时,效率就会很低.所以 Rafy 设计了批量导入插件程序,其内部使用 ADO.NET 及 ODP.NET 中的批量导入机制来把大量数据一次性导入到数据库中.   使用方法 步骤 由于批量导入功能是一个额外的程序集,所以在使用该功能时,需要先使用 NuGet 引用最新版本的 Rafy.Domain.ORM.BatchSubmit 程序集.

用QueryTable向excel批量导入数据

前面写过两篇excel操作的文章,有朋友质疑大批量数据下的性能问题,这个时候最好用批量复制的 方法,可以用excel的QueryTable来直接查询数据库,但是必须引用com组件. 参考代码: using System;using System.Collections.Generic;using System.Text;using System.Reflection;using Excel = Microsoft.Office.Interop.Excel;namespace ConsoleApp

sqlserver-求助:从Oracle向SqlServer导入数据问题

问题描述 求助:从Oracle向SqlServer导入数据问题 情况是这样: 用datareader从oracle中读取数据,100w左右记录,利用.NET的sqlbulkcopy方法插入到sqlserver中. 但是每次执行到80w左右的时候就提示 "primary文件组已满". 网上说的方法都试了没用,磁盘空间足够,ntfs格式.数据库和日志文件设置了自动增长不限大小,每次增长30M-1024M都试过. 目前数据文件在10G左右. 奇怪的是另一张表数据量更大,200多万数据,同样的

C#写从log文件向access自动导入数据的窗口程序,运行一段时间后停止工作,问题事件名称:CLR20r3,求教各位该怎么解决?谢谢

问题描述 各位前辈好:我近日用C#写了个小窗口程序,功能是从log文件向access自动导入数据,并设置间隔一段时间自动运行.但是现在发现,程序起初可以正常实现导入功能,但是运行一段时间后就会停止,问题事件名称:CLR20r3,详细信息如下:问题签名01:readandsyncmonitoringdata.exe问题签名02:1.0.0.0问题签名03:54717fa3问题签名04:System.Data问题签名05:4.0.30319.18408问题签名06:52311175问题签名07:1b