这段时间在解决一个多个表需要同时插入大量数据的问题,于是在网上找了下,查到说用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批量插入 -- 多张表同时插入(事务)的更多相关文章

  1. Oracle两张表关联批量更新其中一张表的数据

    Oracle两张表关联批量更新其中一张表的数据 方法一(推荐): UPDATE 表2 SET 表2.C = (SELECT B FROM 表1 WHERE 表1.A = 表2.A) WHERE EXI ...

  2. 【第十五篇】easyui datagrid的列编辑,同时插入两张表的数据进去

    看图说话. 需求:插入两张表,上面的表单是第一张表的内容,下面的两个表格是第二张详情表的内容,跟第一张表的id关联 第二张表有一个列是需要用户手动填写添加的. 国际惯例,上代码 <div id= ...

  3. sqlserver默认隔离级别下并发批量update同一张表引起的死锁

    提到死锁,最最常规的场景之一是Session1 以排它锁的方式锁定A表,请求B表,session2以排它锁的方式锁定B表,请求A表之类的,访问顺序不一致导致死锁的情况本文通过简化,测试这样一种稍显特殊 ...

  4. Sqlserver将数据从一张表插入到另一张表

    1.如果是整个表复制表达如下: insert into table1 select * from table2 2.如果是有选择性的复制数据表达如下: insert into table1(colum ...

  5. 【Oracle/Java】向三张表各插入百万数据,共用时18分3秒,平均每张表6分钟

    三张表DDL如下: CREATE TABLE tb01 ( "ID" ,) not null primary key, "NAME" NVARCHAR2() n ...

  6. mysqldump批量导出(多张表)表结构及表数据

    Mysql 批量导出表结构(数据) 仅导出结构,不导出数据: 1.导出數據库為dbname的表结构    mysqldump  -h主机地址 -u用户名 -p密码 -d dbname >db.s ...

  7. Springboot+Mybaits之两张表同时插入数据

    项目需求是,一张表添加数据的同时,另外一张表也需要添加数据,话不多说,直接上代码. 1.Controller,我把两个DTO直接放到一个@RequestBody中.其中throws是后台获取当前时间抛 ...

  8. 【Oracle/Java】给十六张表各插入十万条数据 单线程耗时半小时 多线程耗时一刻钟

    测试机Oracle版本: SQL> select * from v$version; BANNER ----------------------------------------------- ...

  9. SqlServer中循环给多张表建立聚簇索引

    缘由 因为在某个复(bian)杂(tai)需求中用到了170+张表进行查询,而且表中的数据过多,查起来缓慢.只能给这些表添加索引.但是,连表名也是无法确定的(无力吐槽). 解决方法 使用游标遍历查询出 ...

随机推荐

  1. Oracle:shared memory realm does not exist

    1. 先描述一个连接Oracle 10g的错误:“shared memory realm does not exist” 如图所示Sqlplus连接时出现这个错误: 2. Oracle 服务器主要组件 ...

  2. linux超级终端minicom的使用方法

    ===== 一.Minicom介绍 =====       Linux下的Minicom的功能与Windows下的超级终端功能相似,可以通过串口控制外部的硬件   设备.适于在linux通过超级终端对 ...

  3. UCOS2系统内核讲述(四)_创建任务

    Ⅰ.写在前面 学习本文之前可以参看我前面的文章: UCOS2_STM32移植详细过程(汇总文章) UCOS2系统内核讲述(一)_总体描述 UCOS2系统内核讲述(二)_初始化调用函数 UCOS2系统内 ...

  4. keepalive脑裂的处理,从节点发现访问的虚拟IP就报警,同时尝试发送内容到主节点服务器关闭keepalive和nginx,或者关机

    解决keepalived脑裂问题   检测思路:正常情况下keepalived的VIP地址是在主节点上的,如果在从节点发现了VIP,就设置报警信息 脚本如下: 1 2 3 4 5 6 7 8 9 10 ...

  5. EntityFramework使用Code First模式创建数据库控制生成单数形式的表名

    使用Code-First模式生成数据库时,默认生成的数据库表的名称为类型的复数形式,例如实体类名称是"User",默认生成的数据库表名为“Users”,多数情况下我们并不想生成的数 ...

  6. jQuery && jEasyUI 扩展功能集合

    jquery-extensions:jQuery && jEasyUI 扩展功能集合 该扩展功能基于 jQuery 1.9.x / 1.10.x / 1.11.x 和 jQuery E ...

  7. 面向对象分析和设计(OOA/D)

    UML不是OOA/D,也不是方法,它仅仅是一种图形表示法(表示的是OOA/D的想法),我们将在OOA/D中应用UML:分析,就是理解客户脑子中的概念,跟客户来沟通,分析出专业术语:设计,对分析出来的专 ...

  8. 原生YII2 增删改查的一些操作(非ActiveRecord)

    1.添加数据 如下,使用insert方法:t_admin_user为数据表名..其他的是属性.. $num = Yii::$app->db->createCommand()->ins ...

  9. ThinkPHP无限级分类

    <?php // +---------------------------------------------------------------------- // | ThinkPHP [ ...

  10. CDialog与CDialogEx的区别联系

    CDialogEx是VS2003之后出现的,VC++6.0没有.CDialogEx = CDialog ExtendExtend的意思是扩展,即扩展的CDialog! 这个类是CDialog的扩展类, ...