帮酷LOGO
0 0 评论
  • 显示原文与译文双语对照的内容
文章标签:  gui  ADO  教程  Sqlbulkcopy  GUID  

介绍

当需要以编程方式从一个数据库复制数据到另一个数据库时,SqlBulkCopyADO.NET 2.0的一个新特性。 允许你在源数据存储和目标数据表之间执行大量数据的复制操作。

背景

我在最后一个应用程序中遇到了一个问题。 我必须做数据迁移工作。 它是从 SQL Server 到 2005. 每个表中有上百万条记录。 另一个问题是,某些表包含 150个上的列。 在FoxPro数据库中没有规范化的概念,我也必须管理。 我在 Stem.Data.sqlclient 中遇到了 SqlBulkCopy 类。

这个类帮助我解决我的问题。 by made使用传统方法,从源数据存储到目标表共享大量数据的思想,因为你需要多次调用数据库,多次调用数据库。 有一些方法可以解决这个问题,但现在通过 Having ADO.NET 2.0来执行大量复制并减少性能和速度。 SqlBulkCopy 是 ADO.NET 2.0和 SqlBulkCopyColumnMapping的核心,和 SqlBulkCopyColumnMappingCollection 对象以这种方式帮助它。 稍后我将更详细地讨论这些对象。

使用代码

SqlBulkCopy

SqlBulkCopy 是帮助你执行批量复制的对象。 可以使用 DataReader 或者 DataTable 作为源数据存储( 你可以从SQL数据库。访问数据库。XML或者。load加载数据。 将它们复制到数据库中,并将它们复制到目标表中。

为了完成这里任务,SqlBulkCopy 使用 SqlBulkCopyColumnMapping 对象的集合,这些对象将保存为它的SqlBulkCopyColumnMappingCollection 属性。 SqlBulkCopyColumnMapping 通过名称或者索引将数据源中的列映射到目标表中的表。

SqlBulkCopy 有一些重要属性,你应该注意能够使用它:

  • BatchSize: 这里整数值指定每次尝试复制到数据库时应复制的行数。 这里值直接影响到数据库访问的数量。
  • BulkCopyTimeOut: 系统等待 SqlBulkCopy 复制行所需的秒数。
  • ColumnMappings: 只读 SqlBulkCopyColumnMappingCollection。需要使用它的Add() 方法在它的集合中添加新的SqlBulkCopyColumnMapping 对象。
  • DestinationTableName: 表目的名称的String 值。
  • NotifyAfter: 当复制这里属性中指定的行数时,将调用 SqlRowsCopied 事件处理程序。

这里对象还有四个重载。 你可以通过 SqlConnection ( 或者连接字符串) 和可选的SqlBulkCopyOptionsSqlTransaction 向它的构造函数传递。 最近两个参数可以改变 SqlBulkCopy 对象的行为。 使用 SqlBulkCopyOptions 枚举器,可以指定例如 SqlBulkCopy 保留标识或者检查约束以及某些其他选项。 使用 SqlTransaction 可以传递外部 SqlTransaction,而 SqlBulkCopy 在流程的所有部分都使用这里事务。

SqlBulkCopy 还有一个 SqlRowsCopied 事件处理程序,当复制了 DataRow的特定数量时触发。 你通过 NotifyAfter 属性指定了该值。 当你想了解流程( 例如通过 ProgressBar 向最终用户显示它) 时,这个处理程序很有用。

有用的方法

关于 SqlBulkCopy 对象应该提到的最后一件事情是它的WriteToServer() 方法。 方法可以获取 DataRowDataTable 或者 DataReader的array,并将它的内容复制到数据库中的目标表中。

SqlBulkCopyColumnMapping

SqlBulkCopyColumnMapping 是将源列映射到大容量副本中的目标列的对象。 SqlBulkCopyColumnMapping 可以通过它的属性或者构造函数获取源和目的列名称或者序数。 它具有以下属性:

  • SourceColumn: 列名称的String
  • SourceOrdinal: 列的源索引的整数值
  • DestinationColumn: 列目的名称的String
  • DestinationOrdinal: 列目的索引的整数值

应该设置 SourceColumnSourceOrdinal 之一以及 DestinationColumnDestinationOrdinal 之一。 也可以通过构造函数来设置这些属性,这是一。

如果源和目的列具有相同的名称,则不需要使用 SqlBulkCopyColumnMapping 对象,因为 SqlBulkCopy 可以自动完成它的工作。

编写示例应用程序

让我们来看看一个例子。 我想你将在稍后看到的示例应用程序可以覆盖你使用 SqlBulkCopy 所需的所有内容。

注意:如果两边都有相同的table和目的,那么我建议你不要提及sql属性,因为它自动执行所有任务。

因为两侧列都相同,所以使用 PerformBulkCopy() 方法。

publicclass mySqlBulkCopy
{privatestaticvoid PerformBulkCopy()
{
 string connectionString =
 @"Server=localhost;Database=Northwind;Trusted_Connection=true";
 // get the source datausing (SqlConnection sourceConnection =
 new SqlConnection(connectionString))
 {
 SqlCommand myCommand =
 new SqlCommand("SELECT * FROM Customer", sourceConnection);
 sourceConnection.Open();
 SqlDataReader reader = myCommand.ExecuteReader();
 // open the destination datausing (SqlConnection destinationConnection =
 new SqlConnection(connectionString))
 {
 // open the connection destinationConnection.Open();
 using (SqlBulkCopy bulkCopy =
 new SqlBulkCopy(destinationConnection.ConnectionString))
 {
 bulkCopy.BatchSize = 500;
 bulkCopy.NotifyAfter = 1000;
 bulkCopy.SqlRowsCopied +=
 new SqlRowsCopiedEventHandler(bulkCopy_SqlRowsCopied);
 bulkCopy.DestinationTableName = " Customer_Backup";
 bulkCopy.WriteToServer(reader);
 }
 }
 reader.Close();
 }
}// this method is used if you want to map columns with different names// you can also use the index of column by using SourceOrdinalprivatestaticvoid PerformBulkCopyMyDifferentSchema()
{
 string connectionString = @"Server=
 localhost;Database=Northwind;Trusted_Connection=true";
 DataTable sourceData = new DataTable();
 // get the source datausing (SqlConnection sourceConnection =
 new SqlConnection(connectionString))
 {
 SqlCommand myCommand =
 new SqlCommand("SELECT *
 FROM Customer", sourceConnection);
 sourceConnection.Open();
 SqlDataReader reader = myCommand.ExecuteReader();
 // open the destination datausing (SqlConnection destinationConnection =
 new SqlConnection(connectionString))
 {
 // open the connection destinationConnection.Open();
 using (SqlBulkCopy bulkCopy =
 new SqlBulkCopy(destinationConnection.ConnectionString))
 {
 bulkCopy.ColumnMappings.Add("CustomerID","ID");
 bulkCopy.ColumnMappings.Add("CustomerName", "Name");
 bulkCopy.ColumnMappings.Add("CustomerPoint", "Points");
 bulkCopy.DestinationTableName = " CustomerPoints";
 bulkCopy.WriteToServer(reader);
 }
 }
 reader.Close();
 }
}
}
}

摘要

如果你熟悉 SQLHELPER 类,那么你可以更有效地提高性能。 在本文中,我讨论了 ADO.NET 2.0,SqlBulkCopy 中新增的功能,帮助你大量复制数据源和数据表之间的大量数据。

历史记录

  • 28th 2007年09月: 初始帖子


文章标签:  gui  教程  GUID  ADO  Sqlbulkcopy  

Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语