用.NET SqlBulkCopy类执行批量复制
在不同數(shù)據(jù)源之間轉(zhuǎn)移數(shù)據(jù)是一個(gè)常見的開發(fā)任務(wù)。如果你應(yīng)用過SQL Server,就會(huì)熟悉bcp(批量復(fù)制)命令。
它允許你快速將大型文件批量復(fù)制到SQL Server表或視圖中。在.NET Framework 1.1中,可以通過SqlCommand對象利用bcp,但.NET Framework 2.0中增加了SqlBulkCopy類來簡化這個(gè)繁瑣的過程。
SqlBulkCopy類
雖然你仍然可以使用t-splbcp命令,但SqlBulkCopy類具有很強(qiáng)的性能優(yōu)勢。你只能使用這個(gè)類往SQL Server表中寫入數(shù)據(jù),但可以使用任何數(shù)據(jù)源。唯一要注意的地方在于,數(shù)據(jù)源的內(nèi)容必須能夠加載到一個(gè)DataTable對象中。
在詳細(xì)說明這個(gè)類的用法前,我們先簡單概括這個(gè)類的功能:
- 單獨(dú)批量復(fù)制操作,可將數(shù)據(jù)從一個(gè)數(shù)據(jù)源移動(dòng)到SQL Server表中。
- 也可執(zhí)行多個(gè)批量復(fù)制操作。
- 在數(shù)據(jù)庫事務(wù)中可執(zhí)行批量復(fù)制操作。
MSDN提供更多關(guān)于SqlBulkCopy類的方法和屬性的細(xì)節(jié)。其最重要的屬性為Destination TableName,最重要的方法為WriteToServer。
DestinationTableName屬性指定接受復(fù)制記錄的表。由于它有一個(gè)由三部分組成的名稱(database.owningschema.name),因此它遵循SQL Server語法。你可以用它的數(shù)據(jù)庫和所有模式來限制表名稱。
數(shù)據(jù)庫通過在連接字符串中指定(通過Initial Catalog值)。另外,如果表名稱使用一個(gè)下劃線或任何其它特殊的字符,你必須使用方括號避免這類名稱,如[database.owningschema.name]。
實(shí)際上由這個(gè)超載的WriteToServer方法執(zhí)行批量復(fù)制。它接受DataTable、DataRow和IDataReader對象為復(fù)制數(shù)據(jù)源。你還可以用DataTable對象包含一個(gè)DataRowState值,指定僅復(fù)制匹配的行。
下一個(gè)Windows控制臺(tái)應(yīng)用程序說明從一個(gè)數(shù)據(jù)庫表向另一個(gè)數(shù)據(jù)庫表復(fù)制數(shù)據(jù)這種非?;镜牟僮鳌乃腅mployees表往這個(gè)表的備份表Employees_bcp中復(fù)制數(shù)據(jù)時(shí),它使用標(biāo)準(zhǔn)的SQL Server 2000 Northwind數(shù)據(jù)庫。
――――――――――――――――――――――――――――
?
查看列表A(列表B中為對應(yīng)的VB.NET代碼)?;旧?#xff0c;這段代碼連接到數(shù)據(jù)庫,并將所有值從Employees表讀入SqlDataReader對象中。
設(shè)定目標(biāo)表名稱后,則使用SqlDataReader對象執(zhí)行批量復(fù)制操作(它作為唯一的參數(shù)提交)。你可以檢查服務(wù)器上的目標(biāo)表,看數(shù)據(jù)是否被復(fù)制。
執(zhí)行多次更新并無差異——你只需重復(fù)使用SqlDataReader對象即可。在同一個(gè)數(shù)據(jù)庫中從一個(gè)表往另一個(gè)表復(fù)制是對bcp的誤用。另一方面,從外部文件中輸入數(shù)據(jù)是一個(gè)常見的操作。
列表C在將一個(gè)文本文件輸入到前一個(gè)例子中用到的表中時(shí)就采用了這個(gè)方法。(列表D中是對應(yīng)的VB.NET代碼。)這段代碼建立一個(gè)新的DataTable對象,為每種數(shù)據(jù)設(shè)立列。
每次讀入一行文件,并用逗號分列,每個(gè)數(shù)據(jù)值分配給DataTable中適當(dāng)?shù)牧?。接下?#xff0c;SqlBulkCopy類的ColumnMappings屬性 允許你使用列名稱,將數(shù)據(jù)源中(我們的DataTable)的一個(gè)列映射到目的地。完成映射后,WriteToServer方法使用提交給它的 DataTable執(zhí)行批量操作。
數(shù)據(jù)移植最佳實(shí)踐
雖然數(shù)據(jù)移植是開發(fā)者經(jīng)常要執(zhí)行的任務(wù),但它并不是一個(gè)非常流行的任務(wù)。請?jiān)谖暮蟮挠懻摬糠峙c.NET社區(qū)分享你的最輕松(最糟糕)的數(shù)據(jù)移植經(jīng)歷和最佳實(shí)踐。
―――――――――――――――――――――――――――
?
?
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.SqlClientModule 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.DataImports 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
轉(zhuǎn)載于:https://www.cnblogs.com/soundcode/archive/2012/09/26/2703642.html
總結(jié)
以上是生活随笔為你收集整理的用.NET SqlBulkCopy类执行批量复制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sqlserver Conversion
- 下一篇: 《设计模式之禅》学习笔记(一)