使用SqlBulkCopy进行数据大批量的迁移

在ASP.NET 2.0中提供了一个新的类 SqlBulkCopy类,它在性能上的优点更超过了上面的方法,它能够经过让DataSet或是DataReader中大量的数据经过数据流直接进行装载,而后能够将这些记录添加到指定的数据表中。
   SqlBulkCopy类只有在SQL Server的表中写入数据,但在使用其它的数据库时,能够经过数据源来使用, SqlBulkCopy类主要包括一个实例方法WriteToServer,它用来把数据从一个数据源传输到另一个数据源。WriteToServer的方法能够快速的写入DataRow数组数据,DataTable和DataReader。在实际开发的过程当中,能够视状况而定,选择咱们所喜欢的方法,咱们看它使用的方法:
  WriteToServer(DataTable)写入数据表
  WriteToServer(DataRow)批次写入数据行
  WriteToServer(DataTable,DataRowState)按行状态写入数据库表
  WriteToServer(DataReader)写入DataReader对象
  在多数状况下,咱们选择最好的方法是DataReader对象,由于DataReader是一个读取只向前和只读流的方式,因此它要比DataTable和DataRows更快,咱们如今来看看下面的代码,它用来把数据从一张表中传输到另外一张表中。
  代码清单:
   string strConnection = ConfigurationManager.AppSettings["conStr"].ToString();//读取Web.config文件中的数据库链接字符串
  SqlConnection sourceconnection = new SqlConnection(strConnection);//数据的链接方式是SQL Server
  sourceconnection.Open();//打开数据库链接
  SqlCommand cmd = new SqlCommand("Select * from MSreplication_options");//经过命令来读取SQL语句
  cmd.Connection = sourceconnection;//获取链接方式
  SqlDataReader reader = cmd.ExecuteReader();//开始执和结果集,获取DataReader记录集
  //链接目标数据库链接,而且打开数据库链接方式,在此因为调用同一个数据库,链接字符串没有变
  SqlConnection destinationConnection = new SqlConnection(strConnection);
  destinationConnection.Open();
  //调用SqlBulkCopy类的方法
  SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection);
  //获取目标表的名称
  bulkCopy.DestinationTableName = "destination";
  //写入DataReader对象
  bulkCopy.WriteToServer(reader);
  //关闭各个对象
  reader.Close();
  sourceconnection.Close();
  destinationConnection.Close();
  上例中,咱们使用的是SQL Server 2005的master数据库,咱们在使用 SqlBulkCopy的时候,须要了解一下它的几个重要的属性:
  BatchSize:属性的整数值;或者若是未设置任何值,则为零。每一批次中的行数。在每一批次结束时,将该批次中的行发送到服务器。
  BulkCopyTimeOu:超时以前操做完成所容许的秒数。若是操做超时,事务便不会提交,并且全部已复制的行都会从目标表中移除。
  ColumnMappings:返回 SqlBulkCopyColumnMapping 项的集合。列映射定义数据源中的列和目标表中的列之间的关系。若是数据源和目标表具备相同的列数,而且数据源中每一个源列的序号位置匹配相应目标列的序号位置,则无需 ColumnMappings 集合。可是若是列计数不一样,或序号位置不一致,则必须使用 ColumnMappings,以确保将数据复制到正确的列中。
  DestinationTableName:指定的目标表中。
  NotifyAfter:属性的整数值,或者若是未设置该属性,则为零。定义在生成通知事件以前要处理的行数。
  在ColumnMappings属性中,咱们能够看到 SqlBulkCopyColumnMapping 项,它主要是用来定义 SqlBulkCopy实例的数据源中的列与该实例的目标表中的列之间的映射。
  结合着上面 SqlBulkCopy的属性咱们再来看一个综合的例子,此例中咱们使用DataTable:
  在本例中,我先本身创建一个数据库 SqlBulkCopySample,而后创建一个表TblOrder,它主要是用来把Northwind数据库中的Orders表数据全导进来,因此它的表结构基本上和Orders同样,它们以应的关系以下:
   ID (OrderID): int
  Name (ShipName): nvarchar(40)
  Address (ShipAddress): nvarchar(60)
  City (ShipCity): nvarchar(15)
  而后在Northwind数据中建立一个存储过程,以下:
  CREATE PROCEDURE dbo.SelectOrders
  AS
  SELECT OrderID, ShipName, ShipAddress, ShipCity
  FROM Orders
  咱们在页面中增长一个按钮的点击事件,当事件触发的时候,执行的代码以下:    private void btnStart_Click(object sender, EventArgs e)
  {
  String sourceConnectionString =
  "Data Source=127.0.0.1;Initial Catalog=Northwind;Integrated Security=True";
  String destinationConnectionString =
  "Data Source=127.0.0.1;;Initial Catalog=SqlBulkCopySample;Integrated Security=True";
  DataTable data = SelectDataFromSource(sourceConnectionString);//获取数据
  CopyDataToDestination(destinationConnectionString, data);//复制数据
  }
  获取数据很是简单,它只是经过执行存储过程返回一个DataTable的查询结果集,以下:
   private DataTable SelectDataFromSource(String connectionString)
  {
  DataTable data = new DataTable();
  using (SqlConnection connection = new SqlConnection(connectionString))
  {
  SqlCommand command = new SqlCommand("SelectOrders", connection);
  command.CommandType = CommandType.StoredProcedure;
  connection.Open();
  SqlDataReader reader = command.ExecuteReader();
  data.Load(reader);
  }
  return data;
  }
  接着,就执行数据复制的操做,此部分的代码为核心的部分,首先咱们经过建立四个 SqlBulkCopyColumnMapping对象,而后把两个数据库中的表之间的一一对应关系表述出来,而后设置好BatchSize及BulkCopyTimeout属性,而后返回 SqlBulkCopyColumnMapping 项的集合,接着定义好目标表的名称,以SqlRowsCopied事件处理程序,在定义在生成通知事件以前要处理的行数时,而后调用WriteToServer(DataTable) 方法写入数据表,结束数据的复制,以下:      private void CopyDataToDestination(String connectionString, DataTable table)
  {
  SqlBulkCopyColumnMapping mapping1 =
  new SqlBulkCopyColumnMapping("OrderID", "ID");
  SqlBulkCopyColumnMapping mapping2 =
  new SqlBulkCopyColumnMapping("ShipName", "Name");
  SqlBulkCopyColumnMapping mapping3 =
  new SqlBulkCopyColumnMapping("ShipAddress", "Address");
  SqlBulkCopyColumnMapping mapping4 =
  new SqlBulkCopyColumnMapping("ShipCity", "City");
  SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionString);
  bulkCopy.BatchSize = 100;
  bulkCopy.BulkCopyTimeout = 5;
  bulkCopy.ColumnMappings.Add(mapping1);
  bulkCopy.ColumnMappings.Add(mapping2);
  bulkCopy.ColumnMappings.Add(mapping3);
  bulkCopy.ColumnMappings.Add(mapping4);
  bulkCopy.DestinationTableName = "tblOrder";
  bulkCopy.SqlRowsCopied +=
  new SqlRowsCopiedEventHandler(bulkCopy_SqlRowsCopied);
  bulkCopy.NotifyAfter = 200;
  bulkCopy.WriteToServer(table);
  }
  在bulkCopy_SqlRowsCopied的处理中,我只简单的经过展示给用户一个友好的提示信息让你能够知道目前有多少行被复制成功。代码以下:      private void bulkCopy_SqlRowsCopied(object sender, SqlRowsCopiedEventArgs e)
  {
  MessageBox.Show
  (String.Format("{0} Rows have been copied.", e.RowsCopied.ToString()));
  }
  这样,在平时的开发中,咱们能够灵活的在ASP.NET中使用 SqlBulkCopy帮助咱们复制大量的数据之间的数据源和数据表,并改善应用程序的性能。
  获取数据很是简单,它只是经过执行存储过程返回一个DataTable的查询结果集,以下:
   private DataTable SelectDataFromSource(String connectionString)
  {
  DataTable data = new DataTable();
  using (SqlConnection connection = new SqlConnection(connectionString))
  {
  SqlCommand command = new SqlCommand("SelectOrders", connection);
  command.CommandType = CommandType.StoredProcedure;
  connection.Open();
  SqlDataReader reader = command.ExecuteReader();
  data.Load(reader);
  }
  return data;
  }
  接着,就执行数据复制的操做,此部分的代码为核心的部分,首先咱们经过建立四个 SqlBulkCopyColumnMapping对象,而后把两个数据库中的表之间的一一对应关系表述出来,而后设置好BatchSize及BulkCopyTimeout属性,而后返回 SqlBulkCopyColumnMapping 项的集合,接着定义好目标表的名称,以SqlRowsCopied事件处理程序,在定义在生成通知事件以前要处理的行数时,而后调用WriteToServer(DataTable) 方法写入数据表,结束数据的复制,以下:      private void CopyDataToDestination(String connectionString, DataTable table)
  {
  SqlBulkCopyColumnMapping mapping1 =
  new SqlBulkCopyColumnMapping("OrderID", "ID");
  SqlBulkCopyColumnMapping mapping2 =
  new SqlBulkCopyColumnMapping("ShipName", "Name");
  SqlBulkCopyColumnMapping mapping3 =
  new SqlBulkCopyColumnMapping("ShipAddress", "Address");
  SqlBulkCopyColumnMapping mapping4 =
  new SqlBulkCopyColumnMapping("ShipCity", "City");
  SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionString);
  bulkCopy.BatchSize = 100;
  bulkCopy.BulkCopyTimeout = 5;
  bulkCopy.ColumnMappings.Add(mapping1);
  bulkCopy.ColumnMappings.Add(mapping2);
  bulkCopy.ColumnMappings.Add(mapping3);
  bulkCopy.ColumnMappings.Add(mapping4);
  bulkCopy.DestinationTableName = "tblOrder";
  bulkCopy.SqlRowsCopied +=
  new SqlRowsCopiedEventHandler(bulkCopy_SqlRowsCopied);
  bulkCopy.NotifyAfter = 200;
  bulkCopy.WriteToServer(table);
  }
  在bulkCopy_SqlRowsCopied的处理中,我只简单的经过展示给用户一个友好的提示信息让你能够知道目前有多少行被复制成功。代码以下:      private void bulkCopy_SqlRowsCopied(object sender, SqlRowsCopiedEventArgs e)
  {
  MessageBox.Show
  (String.Format("{0} Rows have been copied.", e.RowsCopied.ToString()));
  }
  这样,在平时的开发中,咱们能够灵活的在ASP.NET中使用 SqlBulkCopy帮助咱们复制大量的数据之间的数据源和数据表,并改善应用程序的性能。
相关文章
相关标签/搜索