SqlServer SqlBulkCopy批量插入 -- 多张表同时插入(事务)
这段时间在解决一个多个表需要同时插入大量数据的问题,于是在网上找了下,查到说用SqlBulkCopy效率很高,实验后确实很快,10万条数据只要4秒钟,用ef要用40秒。但是我的还需两张表同时插入,且需要用到事务,即有一个失败,全部Rollback,废话不多说,直接上代码吧,下面是用C#语言编写的。
测试代码:这是一个简单的控制台程序,相信你们都看得懂就不多说了
namespace ConsoleApp12
{
class Program
{
static void Main(string[] args)
{
DataTable dt = new DataTable();
dt.Columns.Add("part", typeof(System.String));
dt.Columns.Add("name", typeof(System.String));
for (int i = ; i < ; i++)
{
DataRow dr = dt.NewRow();
dr[] = "餐饮部";
dr[] = "店" + i.ToString();
dt.Rows.Add(dr);
} DataTable dt2 = new DataTable();
dt2.Columns.Add("parts", typeof(System.String));
dt2.Columns.Add("names", typeof(System.String));
for (int i = ; i < ; i++)
{
DataRow dr2 = dt2.NewRow();
dr2[] = "2餐饮部";
dr2[] = "2店" + i.ToString();
dt2.Rows.Add(dr2);
} string connectionString = "server =.; uid = sa; pwd =123456;database=Test";
all.ExecuteSqlTran1(connectionString, "test11", dt, "test12", dt2);
}
}
}
数据库帮助类:主要是这部分,网上是也有写,但是多数含糊而过,并没有给出具体代码,小弟不才,在这里补全了,希望可以帮助到其他的新手。
/// <summary>
/// 多个数据库表同时插入大量数据,并实现数据库事务。
/// </summary>
/// <param name="SQLStringList">多条SQL语句</param>
public static int ExecuteSqlTran1(string connectionString, string TableName1, DataTable dt1, string TableName2, DataTable dt2)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
SqlTransaction tx = conn.BeginTransaction();
cmd.Transaction = tx;
try
{
int count = ; using (SqlBulkCopy sqlBC1 = new SqlBulkCopy(conn, SqlBulkCopyOptions.CheckConstraints, tx))
{
sqlBC1.DestinationTableName = TableName1;//***代表要插入数据的表名
foreach (DataColumn dc in dt1.Columns) //传入上述table
{
sqlBC1.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);//将table中的列与数据库表这的列一一对应
}
sqlBC1.WriteToServer(dt1);
}
using (SqlBulkCopy sqlBC2 = new SqlBulkCopy(conn, SqlBulkCopyOptions.CheckConstraints, tx))
{
sqlBC2.DestinationTableName = TableName2;//***代表要插入数据的表名
foreach (DataColumn dc in dt2.Columns) //传入上述table
{
sqlBC2.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);//将table中的列与数据库表这的列一一对应
}
sqlBC2.WriteToServer(dt2);
}
tx.Commit();
return count;
}
catch(Exception ex)
{
var error = ex.ToString();
tx.Rollback();
return ;
}
}
}
结果在数据库中已经将dt中内容插入了两遍,实现了向两张表同时插入数据,另外,相信大家有耐心看到这的话,3个表同时插入,4个表同时插入也都会了,希望能帮助到大家。
小弟不才,有问题请随时联系我,一起长进知识。
qq:188261629
SqlServer SqlBulkCopy批量插入 -- 多张表同时插入(事务)的更多相关文章
- Oracle两张表关联批量更新其中一张表的数据
Oracle两张表关联批量更新其中一张表的数据 方法一(推荐): UPDATE 表2 SET 表2.C = (SELECT B FROM 表1 WHERE 表1.A = 表2.A) WHERE EXI ...
- 【第十五篇】easyui datagrid的列编辑,同时插入两张表的数据进去
看图说话. 需求:插入两张表,上面的表单是第一张表的内容,下面的两个表格是第二张详情表的内容,跟第一张表的id关联 第二张表有一个列是需要用户手动填写添加的. 国际惯例,上代码 <div id= ...
- sqlserver默认隔离级别下并发批量update同一张表引起的死锁
提到死锁,最最常规的场景之一是Session1 以排它锁的方式锁定A表,请求B表,session2以排它锁的方式锁定B表,请求A表之类的,访问顺序不一致导致死锁的情况本文通过简化,测试这样一种稍显特殊 ...
- Sqlserver将数据从一张表插入到另一张表
1.如果是整个表复制表达如下: insert into table1 select * from table2 2.如果是有选择性的复制数据表达如下: insert into table1(colum ...
- 【Oracle/Java】向三张表各插入百万数据,共用时18分3秒,平均每张表6分钟
三张表DDL如下: CREATE TABLE tb01 ( "ID" ,) not null primary key, "NAME" NVARCHAR2() n ...
- mysqldump批量导出(多张表)表结构及表数据
Mysql 批量导出表结构(数据) 仅导出结构,不导出数据: 1.导出數據库為dbname的表结构 mysqldump -h主机地址 -u用户名 -p密码 -d dbname >db.s ...
- Springboot+Mybaits之两张表同时插入数据
项目需求是,一张表添加数据的同时,另外一张表也需要添加数据,话不多说,直接上代码. 1.Controller,我把两个DTO直接放到一个@RequestBody中.其中throws是后台获取当前时间抛 ...
- 【Oracle/Java】给十六张表各插入十万条数据 单线程耗时半小时 多线程耗时一刻钟
测试机Oracle版本: SQL> select * from v$version; BANNER ----------------------------------------------- ...
- SqlServer中循环给多张表建立聚簇索引
缘由 因为在某个复(bian)杂(tai)需求中用到了170+张表进行查询,而且表中的数据过多,查起来缓慢.只能给这些表添加索引.但是,连表名也是无法确定的(无力吐槽). 解决方法 使用游标遍历查询出 ...
随机推荐
- ASP.NET基础(一)
ExecuteNonQuery()的用法 下面我们将详细讲解如何在Page_Load()中对数据库的增加.删除.修改,最后我们再来总结一下ExecuteNonQuery(),ExecuteScalar ...
- Ubuntu 11.04 下安装配置 JDK 7
第一步:下载jdk-7-linux-i586.tar.gz wget -c http://download.oracle.com/otn-pub/java/jdk/7/jdk-7-linux-i586 ...
- mysql数据库 详解
一.学习目录 1.认识数据库和mysql 2.mysql连接 3.入门语句 4.详解列类型 5.增删改查 INSERT INTO 表名(列1,…… 列n) VALUES(值 1,…… 值 n) ...
- ssh2——Interceptor拦截器
尽管没学过struts1吧.可是了解到struts1中并没有拦截器, 到Struts2才有.它是基于WebWork发展起来的, 顾名思义,说到拦截器大家首先肯定会想到它是拦截东西的,起到一个限制的作 ...
- CRC16
http://www.stmcu.org/chudonganjin/blog/12-08/230184_515e6.html 1.循环校验码(CRC码): 是数据通信领域中最常用的一种差错校验码,其特 ...
- 通过Hadoop安全部署经验总结,开发出以下十大建议,以确保大型和复杂多样环境下的数据信息安全。
通过Hadoop安全部署经验总结,开发出以下十大建议,以确保大型和复杂多样环境下的数据信息安全. 1.先下手为强!在规划部署阶段就确定数据的隐私保护策略,最好是在将数据放入到Hadoop之前就确定好保 ...
- spring boot 启动数据库报错(Exception during pool initialization.)
2018-06-27 14:12:28.804 ERROR 14312 --- [ restartedMain] com.zaxxer.hikari.pool.HikariPool : HikariP ...
- css图标
一.介绍 采用这种字体,我们可以避免网站制作中采用好多图片,一方面解决了浏览器的兼容性问题.另一方面,这些字体都是矢量字体,我们只要在调整这些图标时,将他们的字体大小以及颜色,我们就可以解决很多不是图 ...
- ios应用, 设置不自己主动备份到iCloud
原创文章,转载请注明出处 ios项目,假设有内置下载或者程序动态生成文件的话,就要注意所下载或生成的文件,要不要自己主动备份到iCloud 假设没有合适的理由就自己主动上传大文件的话,可能在不能通过应 ...
- ios开发之 -- 强制横屏
在写项目的时候,会遇到很多稀奇古怪的需求,我就碰到一个写一个网站,需要强制横屏,然后不需要上架,网上看了很多大神的需求,基本都能实现,但是不太好用, 自己参考搞了一个,代码如下: AppDelegat ...