上篇博客中介绍了批量导入数据库的方法;下面介绍一下批量导入过程的核心——SqlBulkCopy类。

下面先介绍一些原理性的东西:SQLBulkCopy类,通常用于数据库之间大批量的数据传递。即使表结构完全不同,也可以通过字段间的对应关系,将数据导进去。需要注意的是,只能导入到SQL Server数据库中。相比SQLServer的Insert语句, SqlBulkCopy 有着明显的性能优势。数据源不限于 SQL Server;可以使用任何数据源,只要数据可加载到DataTable 或可使用IDataReader读取数据。

现在介绍如何使用SqlBulkCopy。

(1)创建SqlBulkCopy对象,用数据库链接对象实例化SqlBulkCopy对象,构造函数固定了操作的数据库;

SqlBulkCopy sqlBC= new SqlBulkCopy(sqlConn)

(2)对应关系:

sqlBC.ColumnMappings.Add("id", "tel");

sqlBC.ColumnMappings.Add("name", "neirong");

通过字段映射,写入对应关系;如果数据源和目标表具有相同的列数,并且数据源中每个源列的序号位置匹配相应目标列的序号位置,则无需 ColumnMappings 集合。但是如果列计数不同,或序号位置不一致,则必须使用 ColumnMappings,以确保将数据复制到正确的列中。

(3)目标表名:

//设置要批量写入的表

sqlBC.DestinationTableName= tableName;

DestinationTableName 属性的 tempdb..#table 或 tempdb.<owner>.#table 可以将数据批量复制到临时表中。如果在 WriteToServer 操作运行期间修改 DestinationTableName,此更改将不会影响当前操作。新的 DestinationTableName 值会在下一次调用 WriteToServer 方法时使用。

(4)写入

//写入

sqlBC.WriteToServer(dt);

将所有行从数据源复制到 SqlbulkCopy对象的DestinationTableName  属性指定的目标表中。

完成以上几步,SqlBulkCopy几乎就会用了;下面来看看SqlBulkCopy其他的属性或方法。

BatchSize属性:

每一批次中的行数。在每一批次结束时,将该批次中的行发送到服务器。处理完 BatchSize 行或已经没有要发送到目标数据源的行时,批处理即完成。零(默认值)指示每个 WriteToServer操作都是一个单一批次。如果在 UseExternalTransactions 选项起作用时已经声明 SqlBulkCopy实例,则一次向服务器 BatchSize 行发送行,但并不进行任何与事务相关的操作。如果UseExternalTransaction 不起作用,则每一批次的行都将作为单独的事务插入。在任何时间都可以设置 BatchSize 属性。如果批量复制已在进行中,当前批次则按上一批次的大小进行大小调整。而后续的批次则使用新的大小。如果 BatchSize 最初时为零,并且在 WriteToServer 操作已在进行中时进行了更改,则该操作将以单一批次加载数据。而同一 SqlBulkCopy 实例上的任何后续 WriteToServer 操作都将使用新的BatchSize。

BulkCopyTimeout属性:

超时之前操作完成所允许的秒数。如果操作超时,事务便不会提交,而且所有已复制的行都会从目标表中移除。

NotifyAfter属性:

NotifyAfter定义在生成通知事件之前要处理的行数。NotifyAfter 属性的整数值,或者如果未设置该属性,则为零。此属性专为用于指示批量复制操作进度的用户界面组件而设计。该属性指示在生成通知事件之前要处理的行数。可以随时设置 NotifyAfter 属性,即便批量复制操作在进行中。在批量复制操作期间所做的更改会在下次通知后生效。新的设置将应用于同一实例的所有后续操作。

SqlRowsCopied属性:

SqlRowsCopied在每次处理完NotifyAfter 属性指定的行数时发生。NotifyAfter 和BatchSize 的设置是相互独立。接收到 SqlRowsCopied 事件并不表明任何行已发送到服务器或已提交。注意:不能通过此事件调用Close方法;批量复制操作执行期间在连接中不支持任何操作(如事务活动)。

下面看看在实例中如何使用:

 #region 批量导入DataTable
/// <summary>批量导入DataTable
/// 批量导入DataTable
/// </summary>
/// <param name="dt">DataTable数据表</param>
/// <param name="tableName">表名</param>
/// <param name="dtColum">数据列集合</param>
/// <return>Boolean值:true成功,false失败</return>
public Boolean InsertTable(DataTable dt, string tableName, DataColumnCollection dtColum)
{
//打开数据库
GetConn();
try
{
//声明SqlBulkCopy ,using释放非托管资源
using (SqlBulkCopy sqlBC = new SqlBulkCopy(sqlConn))
{
//一次批量的插入的数据量
sqlBC.BatchSize = 1000;
//超时之前操作完成所允许的秒数,如果超时则事务不会提交 ,
//数据将回滚,所有已复制的行都会从目标表中移除
sqlBC.BulkCopyTimeout = 60;
//设置要批量写入的表
sqlBC.DestinationTableName = tableName;
for (int i = 0; i < dtColum.Count; i++)
{
sqlBC.ColumnMappings.Add(dtColum[i].ColumnName.ToString(), dtColum[i].ColumnName.ToString());
}
//批量写入
sqlBC.WriteToServer(dt);
}
return true;
}
catch
{
return false; }
finally
{
//关闭数据库
sqlConn.Close();
}
}
#endregion

Excel导入数据库(三)——SqlBulkCopy的更多相关文章

  1. excel 导入数据库 / SSIS 中 excel data source --64位excel 版本不支持-- solution

    当本地安装的excel(2013版) 是64-bit时:出现的以下两种错误 解决: 1. excel 导入数据库 , 如果文件是2007则会出现:“The 'Microsoft.ACE.OLEDB.1 ...

  2. ASP.NET 将Excel导入数据库

    将Excel导入数据库大致流程:  Excel数据->DataSet->数据库 需要做的准备:1.FileUpload控件一个,按钮一个,如果需要即时显示那么GridView或DataGr ...

  3. Java实现将Excel导入数据库和从数据库中导出为Excel

    实现的功能: 用Java实现从Excel导入数据库,如果存在就更新 将数据库中的数据导出为Excel 1.添加jxl.jar mysql-connector-java.1.7-bin.jar包到项目的 ...

  4. 记录-java(jxl) Excel导入数据库

    本内容主要包括(文件上传.excel2003数据导入数据库)excel导入数据库功能需要jxl  jar包支持 下面是文件上传的前端测试代码 <%@ page language="ja ...

  5. Excel导入数据库百万级数据瞬间插入

    Excel导入数据库百万级数据瞬间插入 百万级别,瞬间,有点吊哇

  6. 第三次作业---excel导入数据库及显示(2)

    发现第一次做的功能有点复杂,不能理解.而且第一次的想法是在页面上上传文件,连接并导入到数据库,并在页面上显示.后来才看到要求是直接在本地将数据导入数据库就行了,然后显示.所以才出现了一堆看不懂也解决不 ...

  7. Hibernate+jxl+excel导入数据库

    在将excel中的10w行数据导入数据库中时,总发生内存溢出,一开始使用的Spring+Hibernate;不知如何使用批处理,后来只是用Hibernate,10W行数据几分钟完成, 代码如下: pu ...

  8. 使用thinkphp框架实现Excel导入数据库

    之前讲过php实现Excel导出数据库的随笔,链接:https://www.cnblogs.com/nuanai/p/6727711.html 之前的项目用到较多的就是Excel导出,现在用到了Exc ...

  9. 第三次作业---excel导入数据库及显示

    好吧首先承认这次作业失败了,而且我并不知道原因.另外,我也没有采用PowerDesigner 设计所需要的数据库,代码就用了全部的时间.感觉自己就像一个刚学会爬着走路的小孩去参加一百一十米跨栏,能不能 ...

随机推荐

  1. 最新xgboost python32位下安装xgboost

    网上很多windows python下安装xgboost都是很简单的几步无非是visual studio2013以上版本编译,安装.但现在最新的xgboost已经移除了c++工程文件,找到旧版本的也多 ...

  2. 在Xcode4中给程序提供命令行参数(转)

    网上xcode4的资料实在是不多,再加上xcode4相对3的改动还那么大,并且还只有英文版.我为了这个问题头痛了很久.后来终于找到了...方法如下 xcode菜单的Product->EditSc ...

  3. 【BZOJ2809】【splay启发式合并】dispatching

    Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都有且仅有一个上级. ...

  4. Web控件

    Web控件可分三类 HTML控件 html服务器控件是在HTML控件的基础上,额外增加了一个在当前页面唯一的ID属性值和一个runat = "server" 属性html服务器控件 ...

  5. 用jQuery实现瀑布流效果学习笔记

    jQuery一直没系统的学,只知道是js库,封装了好多js函数,方便了开发.以前做过一个原生的图片网站瀑布流效果,超级麻烦,这次用了jQuery方法,瞬间代码浓缩了,只有56行js代码.神奇的让我来把 ...

  6. Wdcp两日志的路径

    Wdcp两日志的路径: /www/wdlinux/httpd-2.2.22/logs /www/wdlinux/nginx-1.0.15/logs

  7. Python自动化运维之24、JQuery

    jQuery是一个兼容多浏览器的javascript库,核心理念是write less,do more(写得更少,做得更多).它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, ...

  8. 由Python的super()函数想到的

    python-super *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !im ...

  9. 最新iOS 6 in Xcode4.5新特性——Storyboard和属性自动绑定

    最新iOS 6 in Xcode4.5新特性编程之二(上)——Storyboard和属性自动绑定 从Xcode 4.3开始,Storyboard 就是iOS 5和iOS 6中令人兴奋的一个新特性,他将 ...

  10. 转: Linux C 动态内存分配 malloc及相关内容 .

    一.malloc()和free()的基本概念以及基本用法: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针 ...