用.NET SqlBulkCopy类执行批量复制

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

在不同数据源之间转移数据是一个常见的开发任务。如果你应用过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
本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/archive/2012/09/26/2703642.html ,如需转载请自行联系原作者
相关文章
|
IDE API 开发工具
拦截|篡改|伪造.NET类库中不限于public的类和方法
本文除了回顾拦截.NET类库中的方法,实现方法参数的篡改、方法返回结果的伪造,再着重介绍.NET类库中非public类及方法如何拦截。
|
2月前
|
开发框架 .NET C#
C#|.net core 基础 - 删除字符串最后一个字符的七大类N种实现方式
【10月更文挑战第9天】在 C#/.NET Core 中,有多种方法可以删除字符串的最后一个字符,包括使用 `Substring` 方法、`Remove` 方法、`ToCharArray` 与 `Array.Copy`、`StringBuilder`、正则表达式、循环遍历字符数组以及使用 LINQ 的 `SkipLast` 方法。
|
2天前
|
JSON 数据格式
.net HTTP请求类封装
`HttpRequestHelper` 是一个用于简化 HTTP 请求的辅助类,支持发送 GET 和 POST 请求。它使用 `HttpClient` 发起请求,并通过 `Newtonsoft.Json` 处理 JSON 数据。示例展示了如何使用该类发送请求并处理响应。注意事项包括:简单的错误处理、需安装 `Newtonsoft.Json` 依赖,以及建议重用 `HttpClient` 实例以优化性能。
42 2
|
2月前
.NET 4.0下实现.NET4.5的Task类相似功能组件
【10月更文挑战第29天】在.NET 4.0 环境下,可以使用 `BackgroundWorker` 类来实现类似于 .NET 4.5 中 `Task` 类的功能。`BackgroundWorker` 允许在后台执行耗时操作,同时不会阻塞用户界面线程,并支持进度报告和取消操作。尽管它有一些局限性,如复杂的事件处理模型和不灵活的任务管理方式,但在某些情况下仍能有效替代 `Task` 类。
|
2月前
|
API
使用`System.Net.WebClient`类发送HTTP请求来调用阿里云短信API
使用`System.Net.WebClient`类发送HTTP请求来调用阿里云短信API
41 0
|
4月前
|
缓存 程序员
封装一个给 .NET Framework 用的内存缓存帮助类
封装一个给 .NET Framework 用的内存缓存帮助类
|
6月前
|
存储 Go C#
【.NET Core】深入理解IO之File类
【.NET Core】深入理解IO之File类
109 6
|
6月前
|
存储 开发框架 缓存
【.NET Core】你真的了解HttpRuntime类吗
【.NET Core】你真的了解HttpRuntime类吗
65 0
|
7月前
|
消息中间件
.NET 中 Channel 类简单使用
`System.Threading.Channels` 提供异步生产者-消费者数据结构,用于.NET Standard上的跨平台同步。频道实现生产者/消费者模型,允许在任务间异步传递数据。简单示例展示如何创建无界和有界频道,以及多生产者和消费者共享频道的场景。频道常用于内存中的消息队列,通过控制生产者和消费者的速率来调整系统流量。
|
7月前
|
SQL 数据库连接 数据库
VB.NET 中使用SqlConnection类连接到Microsoft SQL Server数据库的详细步骤
VB.NET 中使用SqlConnection类连接到Microsoft SQL Server数据库的详细步骤
337 0