`
yanhuanwang
  • 浏览: 55892 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

[翻译]使用asp.net 2.0中的SqlBulkCopy类批量复制数据

阅读更多
原文地址:http://gridviewguy.com/ArticleDetails.aspx?articleID=233
[原文源码下载]


[翻译]使用asp.net 2.0中的SqlBulkCopy类批量复制数据


原文发布日期:2007.03.01
作者:AzamSharp
翻译:webabcd


介绍:
在软件开发中,把数据从一个地方复制到另一个地方是一个普遍的应用。 在很多不同的场合都会执行这个操作,包括旧系统到新系统的移植,从不同的数据库备份数据和收集数据。 ASP.NET 2.0有一个SqlBulkCopy类,它可以帮助你从不同的数据源复制数据到SQL SERVER数据库。 本文中我将示范SqlBulkCopy类的不同应用。


数据库设计:
这个数据库的设计还是蛮简单的,它基于Northwind数据库的Products表。另外我还在Northwind数据库中创建了3个表。 详情可以看一下下面的数据库关系图。


Products_Archive 和Products_Latest有与Products表相同的结构,而Products_TopSelling表则与它们不同。 稍后我将在本文解释Products_TopSelling表的用途。

Products_Archive表包含770,000行。 你不用管这些数据是如何得到的,你只需要考虑如何把所有这些数据复制到Products_Latest表里。


从Products_Archive表 复制数据到 Products_Latest表:
SqlBulkCopy 包含一个方法 WriteToServer,它用来从数据的源复制数据到数据的目的地。 WriteToServer方法可以处理的数据类型有DataRow[]数组,DataTable 和 DataReader。 你可以根据不同的情形使用不同的数据类型,但是更多时候选择DataReader是一个比较好的主意。 这是因为DataReader是一个只向前的、只读的数据流,它不会保存数据,所以要比DataTable 和 DataRows[]都要快。 下面的代码的作用是把数据从源表复制到目的表。
private static void PerformBulkCopy() 
{
  
string connectionString = @"Server=localhost;Database=Northwind;Trusted_Connection=true";
                        
  
// 源 
  using (SqlConnection sourceConnection = new SqlConnection(connectionString))
  
{
    SqlCommand myCommand 
= new SqlCommand("SELECT * FROM Products_Archive", sourceConnection);
    sourceConnection.Open();
    SqlDataReader reader 
= myCommand.ExecuteReader(); 
                
    
// 目的 
    using (SqlConnection destinationConnection = new SqlConnection(connectionString))
    
{
      
// 打开连接 
      destinationConnection.Open();
                
      
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection.ConnectionString))
      
{
        bulkCopy.BatchSize 
= 500;
    bulkCopy.NotifyAfter 
= 1000;
        bulkCopy.SqlRowsCopied 
+= new SqlRowsCopiedEventHandler(bulkCopy_SqlRowsCopied);
        bulkCopy.DestinationTableName 
= "Products_Latest";
        bulkCopy.WriteToServer(reader);                    
      }

    }


    reader.Close();                 
                
  }
          
}

这里有一对需要提及的知识点。 首先,我使用DataReader来从数据库的表中读取数据。 Products_Latest是目的表,因为数据要从Products_Archive表复制到Products_Latest表。 bulkCopy对象提供了一个SqlRowCopied事件,在每次处理完NotifyAfter属性指定的行数时发生。 本例中的意思就是每处理完1000行就触发一次该事件,因为NotifyAfter被设置成了1000

BatchSize属性是非常重要的,程序性能如何主要就依靠着它。 BatchSize的意思就是同每一批次中的行数,在每一批次结束时,就将该批次中的行发送到数据库。 我将BatchSize设置成了500,其意思就是reader每读出500行就将他们发送到数据库从而执行批量复制的操作。 BatchSize的默认值是“1”,其意思就是把每一行作为一个批次发送到数据库。

设置不同的BatchSize在性能上将给你带来不同的结果。 你应该根据你的需求进行测试,来决定BatchSize的大小。


在不同的映射表之间复制数据
在上面的例子中两个表具有相同的结构。 有时,你需要在具有不同结构的表之间复制数据。 假如你要从Products_Archive表中把所有的产品名称及其数量复制到Products_TopSelling表里。 这两个表有着不同的字段名,具体可以看一下上面的“数据库设计”一节下的。
private static void PerformBulkCopyDifferentSchema()
{
  
string connectionString = @"Server=localhost;Database=Northwind;Trusted_Connection=true";

  DataTable sourceData 
= new DataTable();

  
// 源 
  using (SqlConnection sourceConnection = new SqlConnection(connectionString))
  
{
    SqlCommand myCommand 
= new SqlCommand("SELECT TOP 5 * FROM Products_Archive", sourceConnection);
    sourceConnection.Open();
    SqlDataReader reader 
= myCommand.ExecuteReader();

    
// 目的
    using (SqlConnection destinationConnection = new SqlConnection(connectionString))
    
{
      
// 打开连接
      destinationConnection.Open();

      
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection.ConnectionString))
      
{
        bulkCopy.ColumnMappings.Add(
"ProductID""ProductID");
        bulkCopy.ColumnMappings.Add(
"ProductName""Name");
        bulkCopy.ColumnMappings.Add(
"QuantityPerUnit""Quantity");
        bulkCopy.DestinationTableName 
= "Products_TopSelling";
        bulkCopy.WriteToServer(reader);
      }

    }


    reader.Close();

  }

}

ColumnMappings集合用于映射源表和目的表之间的列。


从XML文件复制数据到数据库的表中
数据源并不局限于数据库的表,你也可以使用XML文件做数据源。 这里有一个非常简单的使用XML文件做数据源进行批量复制操作的例子。
(Products.xml)
<?xml version="1.0" encoding="utf-8" ?>

<Products>

  
<Product productID="1" productName="Chai" />
  
<Product productID="2" productName="Football" />
  
<Product productID="3" productName="Soap" />
  
<Product productID="4" productName="Green Tea" />
    
</Products>

private static void PerformBulkCopyXMLDataSource()
{
  
string connectionString = @"Server=localhost;Database=Northwind;Trusted_Connection=true";

  DataSet ds 
= new DataSet();
  DataTable sourceData 
= new DataTable(); 
  ds.ReadXml(
@"C:\Products.xml");

  sourceData 
= ds.Tables[0];

  
// 目的 
  using (SqlConnection destinationConnection = new SqlConnection(connectionString))
  
{
    
// 打开连接 
    destinationConnection.Open();

    
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection.ConnectionString))
    
{
      
// 列映射
      bulkCopy.ColumnMappings.Add("productID""ProductID");
      bulkCopy.ColumnMappings.Add(
"productName""Name");
                    
      bulkCopy.DestinationTableName 
= "Products_TopSelling";
      bulkCopy.WriteToServer(sourceData);
    }

  }

}

首先把XML文件读进DataTable,然后再使用SqlBulkCopy类的WriteToServer方法。 因为目的表示是Products_TopSelling,所以我们必须执行列映射。


结论
本文中我示范了如何使用.NET 2.0引入的SqlBulkCopy类。 SqlBulkCopy类可以非常简单的把数据从一个数据源复制到SQL SERVER数据库。

我希望你会喜欢本文,祝编程愉快!

webabcd 2007-04-09 08:47 发表评论
分享到:
评论

相关推荐

    在ASP.NET 2.0中操作数据:批更新数据(源码)

    此外,ASP.NET 2.0还引入了SqlBulkCopy类,用于快速将大量数据从一个数据源复制到SQL Server表中,这是批处理的另一种形式。SqlBulkCopy非常适合一次性插入大量记录,而无需为每条记录创建和执行单独的INSERT语句。 ...

    ASP.NET2.0创建数据访问层

    本文档将详细介绍如何在ASP.NET 2.0环境中创建数据访问层,并在此基础上构建业务逻辑层和表现层。 #### 数据访问层(DAL)的作用 数据访问层的主要功能是与数据库进行交互。它负责执行对数据库的操作,如查询、插入...

    利用C#+ASP.Net 2.0技术实现对SQL2005的数据快速拷贝处理程序例子代码

    本示例代码是基于C#编程语言和ASP.NET 2.0框架,利用SqlBulkCopy类来实现对SQL Server 2005数据库的大量数据快速拷贝。以下是对这个知识点的详细解释: 首先,SqlBulkCopy是.NET Framework中System.Data.SqlClient...

    C# 使用SqlBulkCopy类批量复制大数据

    C# 使用SqlBulkCopy类批量复制大数据

    pro ado.net 2.0 章节源码

    ADO.NET 2.0 是微软开发的一个用于处理数据访问的框架,它在.NET Framework中扮演着核心角色。这个"Pro ADO.NET 2.0 章节源码"的压缩包提供了该书籍中各章节的源代码示例,旨在帮助读者深入理解ADO.NET 2.0的工作...

    ADO.NET 2.0的新增功能

    2. **Bulk Copy Operation**:批量复制操作是用于高效地将大量数据从一个数据源(如文件或内存中的数据)一次性复制到另一个数据源(如SQL Server表)。SqlBulkCopy 类提供了这个功能,可以大大减少数据传输的时间。...

    C#使用SqlBulkCopy批量复制数据到数据表

    在C#编程中,`SqlBulkCopy`类是用于高效地将大量数据从源(如DataTable或IDataReader)批量复制到SQL Server数据库表中的工具。这个类特别适用于需要快速迁移大量数据的场景,其性能远优于使用INSERT语句逐行插入...

    SqlBulkCopy(批量复制)使用方法

    `SqlBulkCopy`作为一种高效的批量数据复制工具,在处理大数据量的情况下表现优异。通过合理选择数据源类型以及正确设置参数,可以极大地提高数据导入效率。在实际应用中,开发者可以根据具体场景灵活选择使用`...

    C#SqlBulkcopy批量插入数据

    在.NET框架中,C#提供了...总之,C#的SqlBulkCopy类为开发者提供了快速、高效的批量数据插入功能,是处理大量数据导入的理想选择。在处理大数据量的场景时,合理利用这一工具可以显著提高应用性能,降低系统资源消耗。

    SqlBulkCopy批量插入数据(实例)

    本实例将探讨如何使用SqlBulkCopy类进行批量数据插入,并关注性能优化策略。 首先,SqlBulkCopy类位于`System.Data.SqlClient`命名空间下,通过创建SqlBulkCopy对象并与目标数据库建立连接,可以快速地将大量数据从...

    C#.NET中如何批量插入大量数据到数据库中

    2. **批量插入(Bulk Insert)**:SQL Server 提供了一个`SqlBulkCopy`类,用于快速地将大量数据从一个数据源(如DataTable或DataReader)复制到SQL Server表中。这比逐行插入要快得多。 ```csharp using ...

    .Net中批量插入的几种实现方法

    虽然表值参数在处理小批量数据时效率较高,但在大数据量时,`SqlBulkCopy`通常更胜一筹。 总结起来,批量插入的选择应根据具体需求来定。对于小规模数据,简单的循环插入或增加批量处理即可满足。对于大规模数据,`...

    .SqlBulkCopy.Extension第三方批量复制插入sqlServer数据库的dll程序集(支持批量数据合并插入)

    Z.SqlBulkCopy.Extension第三...使用时直接按照.net中sqlbulkcopy的使用方法调用执行就可以,很方便,没有什么特别的。所以,这是z项目人员,把整个库称为Extension扩展库的原因。 少赚点积分。相互支持。zip压缩文件。

    .net framework2.0

    此外,ADO.NET在2.0版本中也得到了增强,新增了Dataset的Merge方法,用于合并两个数据集,以及SqlBulkCopy类,允许快速大量地将数据导入到SQL Server表中。还有ASP.NET的改进,如AJAX支持,使得Web应用程序能够实现...

    SqlBulkCopy:SQL 批量复制是 ODBC 批量复制 API 的 .NET 包装器

    SqlBulkCopy是.NET框架中一个强大的工具,它允许开发者高效地将大量数据从一个数据源批量复制到SQL Server数据库中。这个功能强大的类是ODBC批量复制API的.NET实现,提供了一种比逐行插入更快速、更节省资源的数据...

    asp.net把execl文件导入数据库

    为了确保数据一致性,建议在导入过程中使用数据库事务。这样,如果在导入过程中发生错误,可以回滚所有更改,避免部分数据导入导致不一致。 5. **批量插入优化**:为了提高性能,可以使用批量插入操作而非一条记录...

    数据库备份与恢复

    同时,可以使用SqlBulkCopy类批量插入数据,这对于大容量备份特别有用。 数据库恢复是备份的逆过程,旨在将数据库还原到先前备份的状态。在ASP.NET 2.0中,这通常涉及使用`RESTORE DATABASE` SQL命令。恢复策略取决...

    批量插入数据使用C#自带SqlBulkcopy类

    在.NET框架中,C#提供了一个非常实用的类——SqlBulkCopy,用于高效地批量插入数据到SQL Server数据库。这个类极大地提升了数据导入的性能,尤其适用于需要处理大量数据的场景。下面我们将深入探讨如何使用...

    Sqlserver批量导入数据的示例(SqlBulkCopy)

    这个类是.NET Framework中的一个组件,它允许我们像使用大容量加载操作一样,将数据从一个数据源快速复制到SQL Server表中。下面我们将详细介绍`SqlBulkCopy`的使用方法及其相关知识点。 ### 1. SqlBulkCopy类的...

    Excel读取和大数据批量导入数据库ASPNET源码

    本程序比较简单,就实现了excel的读取、存入数据库,其实写入数据库用的SqlBulkCopy大数据批量导入 二、菜单功能 ... 1、开发环境为Visual Studio 2010,数据库为SQLServer2008r2,使用.net 2.0开发。

Global site tag (gtag.js) - Google Analytics