Excel导入数据库(三)——SqlBulkCopy

原创 2013年12月04日 20:51:45
           

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

      下面先介绍一些原理性的东西: SQLBulkCopy类,通常用于数据库之间大批量的数据传递。即使表结构完全不同,也可以通过字段间的对应关系,将数据导进去。需要注意的是,只能导入到SQL Server数据库中。相比SQLServerInsert语句, 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


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

用BULK INSERT命令导入数据详解

如果你从事与数据库相关的工作,有可能会涉及到将数据从外部数据文件插入倒SQL Server的操作。本文将为大家演示如何利用BULK INSERT命令来导入数据,并讲解怎样通过改变该命令的一些选项以便更...
  • zw_2011
  • zw_2011
  • 2012年04月20日 10:12
  • 1868

使用SqlBulkCopy将DataTable中的数据批量插入数据库中

#region 使用SqlBulkCopy将DataTable中的数据批量插入数据库中 /// /// 使用SqlBulkCopy将DataTable中的数据批量...

用脚本将excel,csv等文件导入数据库

用脚本将excel,csv等文件导入数据库
  • lky5387
  • lky5387
  • 2010年11月29日 15:48
  • 2312

利用Bulk Insert将Excel中的大批量数据入库

原创,转载请注明出处。//author:MeBack_黯然消魂小弟摸索了二天,终于搞定,不敢独享。第一次使用微软的SqlBulkCopy,其实它也是调用Bulk insert的,只不过微软封装了它,不...
  • iAudio
  • iAudio
  • 2007年11月01日 16:16
  • 706

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

关于sqlBulkCopy的高效批量操作

SQLBulkCopy,用于数据库之间大批量的数据传递。通常用于新,旧数据库之间数据的更新。即使表结构完全不同,也可以通过字段间的对应关系,顺利的将数据导过来。   首先,SQLBulkC...

使用SqlBulkCopy类实现导入excel表格

上篇博客介绍了SqlBulkCopy类批量操作数据库的相关操作,最后提到了可以使用这个类实现excel文件导入数据库,接下来我做简单介绍。...
  • hy6688_
  • hy6688_
  • 2013年10月31日 23:30
  • 3157

Excel表快速导入Sqlserver数据库工具,利用SqlBulkCopy 自已用的



利用SqlBulkCopy批量添加DataTable入SQL Server

引用 using System.Data.SqlClient; using System.Data.OleDb; 获取Excel一个工作表数据 public static DataTabl...
  • jjhua
  • jjhua
  • 2012年12月10日 20:30
  • 2136

C# 上传Excel导入数据 SqlBulkCopy

//获取后缀名         String fileExtension = System.IO.Path.GetExtension(FileUpload1.FileName).ToLower();...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Excel导入数据库(三)——SqlBulkCopy
举报原因:
原因补充:

(最多只允许输入30个字)