• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
洛客
追求完美的用户体验。
博客园    首页    新随笔    联系   管理    订阅  订阅

使用SqlBulkCopy批量装载数据(仅限SqlClient)

    以往访问 SQL Server 2000 时,若有大量的数据记录需要添加到数据库内,例如从主机系统或是 NCR Teradata、Oracle等数据库系统下载大量数据记录,我们想要将它们快速添加到 SQL Server 2000中,可以有的选择是调用 T-SQL 的 Bulk Insert 语法、通过Linked Server 执行 SELECT INTO 语法或是执行 bcp.exe 工具程序,以及通过 DTS 的 Bulk Insert Task 或启动Transform Data Task 的快速装载(Use Fast Load)设置。

 

但若要通过自行编写的程序完成批次装载,只能以 C/C++ 调用 OLEDB 或 ODBC 的 Bulk API,无法通过 ADO.NET 或 ADO 等对象来执行。

 

         ADO.NET 2.0 的 SqlClient 提供了一个新的类称为 SqlBulkCopy,它让 DataSet 内大量的数据或是 DataReader通过数据流(Stream)直接读取大量的记录,可以快速将这些记录添加到目的数据库的数据表中。但要注意的是它并非如我们一般用的 bcp.exe工具程序,可以从某个符号分隔文件读取大量数据,选择性地搭配格式文件(Format File)将记录装载到数据库中,或是将数据库内的数据导出成为一个文件。但由于DataSet 能集成 XML 数据,因此依然可以采用 SqlBulkCopy 类型,轻松地通过 DataSet 将 XML 文件数据大量转入到数据库。

 

可以利用SqlBulkCopy类快速写入大批量数据,针对SQL Server的优化,可以写入DataRow数据,DataTable,DataReader,并且可以映射不同的数据列名

  WriteToServer(DataTable)写入数据表

  WriteToServer(DataRow[])批次写入数据行

  WriteToServer(DataTable ,DataRowState)按行状态写入数据库表

  WriteToServer(IDataReader)写入DataReader对象

 

下面是个示例:

 

using (SqlConnection sqlcon =

            new SqlConnection("Data Source=192.168.80.242;user id=oa;password=oapassword;initial catalog=test"))

        {

            sqlcon.Open();

            using (SqlBulkCopy bcp = new SqlBulkCopy(sqlcon))

            {

                bcp.BulkCopyTimeout = 3000;

                bcp.DestinationTableName = "dbo.Test01";

                bcp.ColumnMappings.Add("id", "id");

                bcp.ColumnMappings.Add("name1", "name1");

                bcp.ColumnMappings.Add("name2", "name2");

                bcp.ColumnMappings.Add("name3", "name3");

                        //映射到不同名列

                bcp.ColumnMappings.Add("changedname4", "name4");

                bcp.WriteToServer(dt);

                sqlcon.Close();

 

            }

        }

 

但是SqlBulkCopy使用时要注意以下几点:

1.确认确实需要大容量更新在执行此操作,(几十行的数据请尽量使用别的渠道把).

2. 

3.确认数据一致性,与检查机制,以免遇到主键冲突,数据不符格式等意外。

4. 

3.SqlBulkCopy操作可能会导致对目标表元数据的更改(例如,禁用约束检查时)。如果出现这种情况,访问大容量插入表的并发快照隔离事务将失败。

 

4. SqlBulkCopy将向数据库下大容量更新锁,请注意并发性,以免其他连接因长时间等待而超时。(下图为2005锁兼容列表)

posted @ 2007-07-06 20:32  洛客  阅读(890)  评论(1)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3