在不同数据源之间转移数据是一个常见的开发任务。如果你应用过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执行批量操作。

数据移植最佳实践

虽然数据移植是开发者经常要执行的任务,但它并不是一个非常流行的任务。请在文后的讨论部分与.NET社区分享你的最轻松(最糟糕)的数据移植经历和最佳实践。

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

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
namespace BCP {
class Program {
static void Main(){
string cString = "Data Source=(local);User ID=tester;Password=tester;Initial Catalog=Northwind;";
using (SqlConnectionconn = new SqlConnection(cString))
{
conn.Open();
SqlCommand comm = new SqlCommand("SELECT EmployeeID, FirstName, LastName, HomePhone FROM Employees;", conn);
SqlDataReader reader = comm.ExecuteReader();
using (SqlConnection conn2 = new SqlConnection(cString)){
conn2.Open();
using (SqlBulkCopy bcp = new SqlBulkCopy(conn2))
{
bcp.DestinationTableName = "dbo.Employees_bcp";
try {
bcp.WriteToServer(reader);
} catch (Exception ex) {
Console.WriteLine(ex.Message);
} finally {
reader.Close();
} } } } } } }

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

Imports System.Data.SqlClient
Module Module1
Sub Main()
Dim cString As String
cString = "Data Source=(local);User ID=tester;Password=tester;Initial Catalog=Northwind;"
Dim conn As New SqlConnection
conn = New SqlConnection(cString)
conn.Open()
Dim comm As SqlCommand
comm = New SqlCommand("SELECT EmployeeID, FirstName, LastName, HomePhone FROM Employees;", conn)
Dim reader As SqlDataReader
reader = comm.ExecuteReader()
Dim conn2 As SqlConnection
conn2 = New SqlConnection(cString)
conn2.Open()
Dim bcp As SqlBulkCopy
bcp = New SqlBulkCopy(conn2)
bcp.DestinationTableName = "dbo.Employees_bcp"
Try
bcp.WriteToServer(reader)
Catch ex As Exception
Console.WriteLine(ex.Message)
Finally
reader.Close()
End Try
End Sub
End Module
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.IO;
using System.Data;
namespace BCP {
class Program{
static void Main(){
string cString = "Data Source=(local);User ID=tester;Password=tester;Initial Catalog=Northwind;";
using (SqlConnectionconn = new SqlConnection(cString)) {
conn.Open();
SqlCommandcomm = new SqlCommand("SELECT FirstName, LastName, HomePhone, Title FROM Employees;", conn);
SqlDataReader reader = comm.ExecuteReader();
using (SqlConnection conn2 = new SqlConnection(cString)) {
conn2.Open();
using (SqlBulkCopybcp = new SqlBulkCopy(conn2)){
DataTabledt = new DataTable();
DataRowdr;
DataColumn dc;
bcp.DestinationTableName = "dbo.Employees_bcp";
dc = new DataColumn();
dc.ColumnName = "Last";
dt.Columns.Add(dc);
dc = new DataColumn();
dc.ColumnName = "First";
dt.Columns.Add(dc);
dc = new DataColumn();
dc.ColumnName = "HomePhone";
dt.Columns.Add(dc);
dc = new DataColumn();
dc.ColumnName = "Title";
dt.Columns.Add(dc);
StreamReadersr = new StreamReader(@"c:emp.txt");
string input;
while ((input = sr.ReadLine()) != null) {
string[] s = input.Split(new char[] );
dr = dt.NewRow();
dr["Last"] = s[0];
dr["First"] = s[1];
dr["HomePhone"] = s[2];
dr["Title"] = s[3];
dt.Rows.Add(dr);
}
sr.Close();
try {
bcp.ColumnMappings.Add("Last", "LastName");
bcp.ColumnMappings.Add("First", "FirstName");
bcp.ColumnMappings.Add("Title","Title");
bcp.ColumnMappings.Add("HomePhone","HomePhone");
bcp.WriteToServer(dt);
} catch (Exception ex){
Console.WriteLine(ex.Message);
} finally {
reader.Close();
} } } } } } }
Imports System.Data
Imports System.Data.SqlClient
Imports System.IO
Module Module1
Sub Main()
Dim cString As String
Dim comma As Char
comma = ","
cString = "Data Source=(local);User ID=tester;Password=tester;Initial Catalog=Northwind;"
Dim conn As New SqlConnection
conn = New SqlConnection(cString)
conn.Open()
Dim comm As SqlCommand
comm = New SqlCommand("SELECT EmployeeID, FirstName, LastName, HomePhone FROM Employees;", conn)
Dim reader As SqlDataReader
reader = comm.ExecuteReader()
Dim conn2 As SqlConnection
conn2 = New SqlConnection(cString)
conn2.Open()
Dim bcp As SqlBulkCopy
bcp = New SqlBulkCopy(conn2)
bcp.DestinationTableName = "dbo.Employees_bcp"
Try
Dim dt As DataTable
Dim dr As DataRow
Dim dc As DataColumn
dt = New DataTable()
bcp.DestinationTableName = "dbo.Employees_bcp"
dc = New DataColumn()
dc.ColumnName = "Last"
dt.Columns.Add(dc)
dc = New DataColumn()
dc.ColumnName = "First"
dt.Columns.Add(dc)
dc = New DataColumn()
dc.ColumnName = "HomePhone"
dt.Columns.Add(dc)
dc = New DataColumn()
dc.ColumnName = "Title"
dt.Columns.Add(dc)
Dim sr As StreamReader
sr = New StreamReader("c:emp.txt")
Dim input As String
input = sr.ReadLine()
While Not (input Is Nothing)
Dim s As String()
s = input.Split(comma)
dr = dt.NewRow()
dr("Last") = s(1)
dr("First") = s(2)
dr("HomePhone") = s(3)
dr("Title") = s(4)
dt.Rows.Add(dr)
input = sr.ReadLine()
End While
sr.Close()
bcp.ColumnMappings.Add("Last", "LastName")
bcp.ColumnMappings.Add("First", "FirstName")
bcp.ColumnMappings.Add("Title", "Title")
bcp.ColumnMappings.Add("HomePhone", "HomePhone")
bcp.WriteToServer(dt)
Catch ex As Exception
Console.WriteLine(ex.Message)
Finally
reader.Close()
End Try
End Sub
End Module

转载于:https://www.cnblogs.com/soundcode/archive/2012/09/26/2703642.html

用.NET SqlBulkCopy类执行批量复制相关推荐

  1. 使用asp.net 2.0中的SqlBulkCopy类批量复制数据

    介绍: 在软件开发中,把数据从一个地方复制到另一个地方是一个普遍的应用. 在很多不同的场合都会执行这个操作,包括旧系统到新系统的移植,从不同的数据库备份数据和收集数据. ASP.NET 2.0有一个S ...

  2. 用.net中的SqlBulkCopy类批量复制数据 (转载)

    在软件开发中,把数据从一个地方复制到另一个地方是一个普遍的应用. 在很多不同的场合都会执行这个操作,包括旧系统到新系统的移植,从不同的数据库备份数据和收集数据. .NET 2.0有一个SqlBulkC ...

  3. C# 使用 SqlBulkCopy 类批量复制数据到数据库

    最近公司需要优化导入的问题,由于之前使用的方式是生成 Insert 语句插入数据库,数据量小的时候还行,但是随着发展数据量渐渐大了,之前的方法性能就跟不上了,于是发现了 SqlBulkCopy 这个类 ...

  4. .net2.0中SqlBulkCopy批量复制数据出错原因分析!

    在项目后台数据库选择SqlServer,进行批量复制数据时,.net2.0中提供的SqlBulkCopy不失为一个好的选择,性能相当可观;最近亲手实验一把,效果不错,大家可以参见http://www. ...

  5. SqlBulkCopy批量复制数据

    在.Net1.1中无论是对于批量插入整个DataTable中的所有数据到数据库中,还是进行不同数据源之间的迁移,都不是很方便.而 在.Net2.0中,SQLClient命名空间下增加了几个新类帮助我们 ...

  6. .net使用SqlBulkCopy类操作DataTable批量插入数据库数据,然后分页查询坑

    在使用SqlBulkCopy类操作DataTable批量插入数据,这种操作插入数据的效率很高,就会导致每一条数据在保存的时间基本一样,在我们分页查询添加的数据是,使用数据的添加时间来排序就会出现每页的 ...

  7. SqlBulkCopy 批量复制数据到数据表

    使用 SqlBulkCopy 类只能向 SQL Server 表写入数据.但是,数据源不限于 SQL Server:可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataR ...

  8. ssis 映射列 使用变量_SSIS中的动态列映射:SqlBulkCopy类与数据流

    ssis 映射列 使用变量 The Data Flow Task is an essential component in SQL Server Integration Services (SSIS) ...

  9. FICO_通过参考创建方式批量复制跨科目表的总账科目

    目录 方法概览 配置前提:配置总账科目的字段状态变式 参考公司代码创建总账科目 Copy G/L accounts under the same client from company code to ...

最新文章

  1. jittor 和pytorch的生成网络对比之aae
  2. 数据仓库—stg层_手把手教你创建BI数据仓库STG层
  3. Delphi替换PE图标资源
  4. 28行代码AC——Minimum Sum LCM UVA - 10791(最大质因子)
  5. 【C++ grammar】引用
  6. python修改y轴刻度_Python | Y轴刻度限制
  7. 返回顶部:js代码篇
  8. CentOS 7系统升级备份恢复实验记录
  9. yum方式安装android_在CentOS 7和Ubuntu14.04上安装Android Studio
  10. Raki的读paper小记:A Unified MRC Framework for Named Entity Recognition
  11. SVN版本控制介绍与使用(超详细版)
  12. Vue-element-admin 基础模板
  13. light动名词_2015年12月英语六级语法知识:动名词
  14. 已知销售额怎么计算成本_计算成本根据销售额怎么样推算出成本,举例, – 手机爱问...
  15. 如何让Bing快速收录你的网站?
  16. 华南植物园除夕牡丹花展 近万盆鲜花将亮相
  17. 关于CAN报文中ACK应答错误的检测原理
  18. 多元线性回归预测房价
  19. 秋招斩获所有互联网大厂面经之算法
  20. Unity计算着色器 01

热门文章

  1. 关于Retinex图像增强算法的一些新学习
  2. Android实现系统关机和重启
  3. 阿里云数据库备份DBS商业化发布,数据库实时备份到OSS
  4. 【天池直播--预告】美女程序猿带你用大数据吃鸡(有内涵-这是一个有大奖的活动)...
  5. Python--day7--面向对象编程进阶
  6. JavaScript总结(一)
  7. 计数排序,基数排序,桶排序
  8. 从“大数据”到“智能数据”
  9. 转贴一篇关于NAT(DNAT)以及PAT的讨论
  10. hive in 写法/linux OR CDH如果查看hive的版本