用.NET SqlBulkCopy类执行批量复制

在不同数据源之间转移数据是一个常见的开发任务。如果你应用过SQL Server,就会熟悉bcp(批量复制)命令。

它允许你快速将大型文件批量复制到SQL Server表或视图中。在.NET Framework 1.1中,可以通过SqlCommand对象利用bcp,但.NET Framework 2.0中增加了SqlBulkCopy类来简化这个繁琐的过程。

SqlBulkCopy类

虽然你仍然可以使用t-splbcp命令,但SqlBulkCopy类具有很强的性能优势。你只能使用这个类往SQL Server表中写入数据,但可以使用任何数据源。唯一要注意的地方在于,数据源的内容必须能够加载到一个DataTable对象中。

在详细说明这个类的用法前,我们先简单概括这个类的功能:

  • 单独批量复制操作,可将数据从一个数据源移动到SQL Server表中。
  • 也可执行多个批量复制操作。
  • 在数据库事务中可执行批量复制操作。

MSDN提供更多关于SqlBulkCopy类的方法和属性的细节。其最重要的属性为Destination TableName,最重要的方法为WriteToServer。

DestinationTableName属性指定接受复制记录的表。由于它有一个由三部分组成的名称(database.owningschema.name),因此它遵循SQL Server语法。你可以用它的数据库和所有模式来限制表名称。

数据库通过在连接字符串中指定(通过Initial Catalog值)。另外,如果表名称使用一个下划线或任何其它特殊的字符,你必须使用方括号避免这类名称,如[database.owningschema.name]。

实际上由这个超载的WriteToServer方法执行批量复制。它接受DataTable、DataRow和IDataReader对象为复制数据源。你还可以用DataTable对象包含一个DataRowState值,指定仅复制匹配的行。

下一个Windows控制台应用程序说明从一个数据库表向另一个数据库表复制数据这种非常基本的操作。从它的Employees表往这个表的备份表Employees_bcp中复制数据时,它使用标准的SQL Server 2000 Northwind数据库。

――――――――――――――――――――――――――――

 

查看列表A列表B中为对应的VB.NET代码)。基本上,这段代码连接到数据库,并将所有值从Employees表读入SqlDataReader对象中。

设定目标表名称后,则使用SqlDataReader对象执行批量复制操作(它作为唯一的参数提交)。你可以检查服务器上的目标表,看数据是否被复制。

执行多次更新并无差异——你只需重复使用SqlDataReader对象即可。在同一个数据库中从一个表往另一个表复制是对bcp的误用。另一方面,从外部文件中输入数据是一个常见的操作。

列表C在将一个文本文件输入到前一个例子中用到的表中时就采用了这个方法。(列表D中是对应的VB.NET代码。)这段代码建立一个新的DataTable对象,为每种数据设立列。

每次读入一行文件,并用逗号分列,每个数据值分配给DataTable中适当的列。接下来,SqlBulkCopy类的ColumnMappings属性允许你使用列名称,将数据源中(我们的DataTable)的一个列映射到目的地。完成映射后,WriteToServer方法使用提交给它的DataTable执行批量操作。

 

/// <summary>
        /// 批量数据复制
        /// </summary>
        /// <param name="dt">数据</param>
        /// <param name="toTable">目标表</param>
        /// <param name="con">数据库连接</param>
        /// <param name="ts">事务</param>
        public void BulkCopyData(DataTable dt, string toTable, IDbConnection con, IDbTransaction ts)
        {
            try
            {
                using (SqlBulkCopy copy = new SqlBulkCopy(con as SqlConnection, SqlBulkCopyOptions.CheckConstraints, ts as SqlTransaction))
                {
                    copy.DestinationTableName = toTable;

                    foreach (DataColumn dc in dt.Columns)
                    {
                        copy.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);
                    }

                    copy.WriteToServer(dt);
                }
            }
            catch (SqlException ex)
            {
                throw ex;
            }
        }


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值