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

下面代码测试了数据量为一百万条数据,几次测试耗时8秒左右。

        /// <summary>
/// SqlBulkCopy类的使用,批量更新数据
/// </summary>
public static void SqlBulkCopyDemo()
{
String connStr = ConfigurationManager.ConnectionStrings["connStr"].ToString();
//从数据库中获得表结构和数据
DataTable student = new DataTable();
SqlDataAdapter adapter = new SqlDataAdapter("select * from student", connStr);
adapter.Fill(student);
//向表中添加数据
DataRow dr;
Random r = new Random();
Stopwatch st = new Stopwatch();
for(int i = 0; i<1000000; i++)//一百万条数据
{//数据表中的列:name,no,age,sex
dr = student.NewRow();
dr[0] = "小花" + i;
dr[1] = 108 + i;
dr[2] = r.Next(9, 40);//这里是因为数据表中有约束,
dr[3] = (i % 2 == 0 ? "男" : "女");//这个也是有约束
student.Rows.Add(dr);
}
SqlBulkCopy bulk = new SqlBulkCopy(connStr);
bulk.DestinationTableName = "student";//设置目标表,这里是数据库中的student表
bulk.ColumnMappings.Add(0, 0);//建立映射关系
bulk.ColumnMappings.Add(1, 1);
bulk.ColumnMappings.Add(2, 2);
bulk.ColumnMappings.Add(3, 3);
st.Start();//开始计时
bulk.WriteToServer(student.GetChanges());
st.Stop();//结束计时
Console.WriteLine("数据插入成功,耗时为:" + st.ElapsedMilliseconds + "毫秒");
}

1、SqlBulkCopy类的构造方法

其中: conn表示一个SqlConnection对象

connStr表示数据库连接字符串

  1. SqlBulkCopy(conn)
  2. SqlBulkCopy(connStr)
  3. SqlBulkCopy(connStr, SqlBulkCopyOptions copyOptions)
  4. SqlBulkCopy(conn, SqlBulkCopyOptions copyOptions, SqlTransaction externalTransaction)

其中还有几个陌生的对象:SqlBulkCopyOptions 和 SqlTransaction

1.1、SqlBulkCopyOptions类

这个类是一个枚举类型:

对象 备注
Default 0  
KeepIdentity 1 保留源标识值。
如果未指定,则由目标分配标识值。
CheckConstraints 2 在插入数据的同时检查约束。
默认情况下,不检查约束。
TableLock 4 在批量复制操作期间获取批量更新锁。
如果未指定,则使用行锁。
KeepNulls 8 保留目标表中的空值,而不管默认值的设置如何。
如果未指定,则空值将由默认值替换(如果适用)
FireTriggers 16 指定后,会导致服务器为插入到数据库中的行激发插入触发器。
UseInternalTransaction 32

如果已指定,则每一批批量复制操作将在事务中进行。

如果指示了此选项,并且为构造函数提供了 System.Data.SqlClient.SqlTransaction对象,则发生 System.ArgumentException(参数异常)。因为两个事务冲突了。

1.2、SqlTransaction类

这个类是事务类,是个密封类,实现了DbTransaction抽象类

2、SqlBulkCopy类的常用属性

属性名 功能 备注
BatchSize 设置或获取每达到多少行就更新到服务器(也就是目标表) 值为int,
BulkCopyTimeout 设置或获取超时时间 默认30秒,如果设置成0,将无限制等待,
值为int,单位为秒
DestinationTableName 设置或获取服务器上的目标表的名称 也就是批量更新的目标表,
值为String类型
EnableStreaming 设置或获取是否支持传输 IDataReader 对象的数据 true为支持,
值为bool类型
NotifyAfter 设置或获取在生成通知事件之前要处理的行数 默认为0,
值为int类型,
ColumnMappings 获取列映射定义数据源中的列和目标表中的列之间的映射关系 返回值为SqlBulkCopyColumnMappingCollection

2.1、表中的SqlBulkCopyColumnMappingCollection类型是一个映射集合类,是目标表的列和源表的列的映射关系的集合。

这个类是一个密封类,不能被继承,实现了一个CollectionBase抽象类。

SqlBulkCopyColumnMappingCollection没有提供构造方法,我们也不需要去newat的对象,主要是使用它的几个重载的Add()方法

Add()有五个重载的方法:

  • SqlBulkCopyColumnMapping Add(SqlBulkCopyColumnMapping bulkCopyColumnMapping);
  • SqlBulkCopyColumnMapping Add(string sourceColumn, string destinationColumn);
  • SqlBulkCopyColumnMapping Add(int sourceColumnIndex, string destinationColumn);
  • SqlBulkCopyColumnMapping Add(string sourceColumn, int destinationColumnIndex);
  • SqlBulkCopyColumnMapping Add(int sourceColumnIndex, int destinationColumnIndex);

其中四个方法是类似的,都是对应的列名或者列的位置。

第一个方法是添加一个已经构建好的SqlBulkCopyColumnMapping对象,

他也有集合常用的方法:

方法名 功能 备注
Clear(); 清除集合中的映射关系  
Contains(SqlBulkCopyColumnMapping value); 判断是否包含指定映射关系  
IndexOf(SqlBulkCopyColumnMapping value); 返回指定映射关系的位置  
Remove(SqlBulkCopyColumnMapping value); 移除指定映射关系  
RemoveAt(int index); 移除指定位置的映射关系  
Insert(int index, SqlBulkCopyColumnMapping value); 在指定位置插入映射关系  
CopyTo(SqlBulkCopyColumnMapping[] array, int index); 从指定位置开始将映射关系复制到指定数组中 index指定的集合中的位置,
而不是数组中的角标

3、SqlBulkCopy类的常用方法

  • WriteToServer,这个方法重载了四次,功能是将数据写到目的表中。
WriteToServer(DataRow[] rows); 将 DataRow 数组所有元素写到目标表中
WriteToServer(DataTable table); 将 DataTable 所有行写到目标表中
WriteToServer(IDataReader reader); 将指定的 IDataReader 对象中的数据写到目标表中
WriteToServer(DataTable table, DataRowState rowState); 将 DataTable 中指定状态的所有行写到目标表中

【上表中的 DataRowState 状态行可以参考这篇博客DataTable的AcceptChanges()方法和DataRow的RowState属性

既然能够有写的操作,那这个类应该类似于流,它还有一个Close()方法,用于关闭 SqlBulkCopy 实例。

  

大批量导入数据的SqlBulkCopy类的更多相关文章

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

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

  2. IBatis.Net 下使用SqlBulkCopy 大批量导入数据 问题解决

    SQLBulkCopy是继承SQLClient空间下的一个特殊类,它可以帮助我们以映射的方式把DataTable和DataReader数据大批量导入到数据库对应表中 public void Inert ...

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

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

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

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

  5. SqlBulkCopy类进行大数据(一万条以上)插入测试

    好多天没写博客了,刚刚毕业一个多月! 关于上一篇博客中提到的,在进行批量数据插入数据库的时候可以通过给存储过程传递一个类型为Table的参数进行相关操作,在这个过程中本人没有进行效率的测试.后来查找发 ...

  6. SqlBulkCopy类进行大数据(10000万条以上)插入测试

    好多天没写博客了,刚刚毕业一个多月,在IT的路上真是迷茫啊! 关于上一篇博客中提到的,在进行批量数据插入数据库的时候可以通过给存储过程传递一个类型为Table的参数进行相关操作,在这个过程中本人没有进 ...

  7. 转:SqlBulkCopy类进行大数据(一万条以上)插入测试

    转自:https://www.cnblogs.com/LenLi/p/3903641.html 结合博主实例,自己测试了一下,把数据改为3万行更明显!! 关于上一篇博客中提到的,在进行批量数据插入数据 ...

  8. geotrellis使用(二十一)自动导入数据

    目录 前言 整体介绍 前台界面 后台控制 总结 一.前言        之前Geotrellis数据导入集群采用的是命令行的方式,即通过命令行提交spark任务来ingest数据,待数据导入完毕再启动 ...

  9. 使用BCP批量导入数据

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

随机推荐

  1. 10分钟精通require.js

    require.js的诞生,就是为了解决这两个问题:(1)实现js文件的异步加载,避免网页失去响应:(2)管理模块之间的依赖性,便于代码的编写和维护. 实例下载:require.js应用实例 一.re ...

  2. ububuntu配置ip和dns

    装完ubuntu 第一件事情就是连上网,换个源,进行更新操作,但前提条件是要配好ip和dns. 下面把自己配置的过程记录下来,权且当作一份备份,以便不时之需. 一.配置ip ubuntu的网络配置信息 ...

  3. NGINX proxy_pass 域名解析问题

    前两天发现一个问题,当使用proxy_pass的时候,发现域名对应IP是缓存的,这样一旦VIP变化之后,就会报错,下面就来详细分析一下这个问题. 一.问题说明 location = /test { i ...

  4. MongoDB副本集配置系列三:副本集的认证方式

    1:副本集配置参考这篇博客: http://www.cnblogs.com/xiaoit/p/4478951.html 2:副本集的认证 假设有两台机器已经配置好了副本集(副本集罪一般最少3台机器,这 ...

  5. Markdown中实时显示数学公式的方法

    Markdown中实时显示数学公式的方法 Markdown非常好用,但是对于数学公式的实时显示有一些缺陷,如何解决这一问题呢? 一.在线LaTex编辑 点击在线LaTeX编辑方式 在对话框中输入数学公 ...

  6. Windows虚拟内存不足问题的处理

    一般而言,当系统缺少虚拟内存会引起很多问题,包含但不限于: 操作系统运行缓慢,甚至出现Hang(夯机),蓝色背景界面的情况 用户本地控制台输入用户名.密码后,无法登录到操作系统,卡在欢迎界面 无法远程 ...

  7. 一网打尽2013最常用的NoSQL数据库

      摘要:与关系数据库相比,每个NoSQL都有自己不同的适用场景,这里带大家盘点文档数据库.图数据库.键值数据存储.列存储数据库与内存数据网络等领域的常用的NoSQL. 在几年内,NoSQL数据库一直 ...

  8. MFQ

    一什么是MFQ&PPDCS?MFQ&PPDCS是由外部教练邰晓梅提出的一套测试分析和测试设计方法.MFQ将被测对象分层,针对不同层次进行测试分析和设计进行,使测试设计人员不会那么容易忘 ...

  9. HTML5 Audio标签方法和函数API介绍

    问说网 > 文章教程 > 网页制作 > HTML5 Audio标签方法和函数API介绍 Audio APIHTML5HTML5 Audio预加载 HTML5 Audio标签方法和函数 ...

  10. [转载]linux下如何查看系统和内核版本

    原文地址:linux下如何查看系统和内核版本作者:vleage 1. 查看内核版本命令: 1) [root@q1test01 ~]# cat /proc/version Linux version 2 ...