摘要: VIsual Basic 2005 - 如何使用 SqlBulkCopy 物件來執行大量複製作業
許多人都有一個疑問,那就是不知道該如何於前端應用程式中完成資料庫之間的大量複製作業。在此我們要示範如何使用 SqlBulkCopy 物件來完成大量複製作業,它會將 Access 資料庫「彙整.mdb」之「章立民工作室」的兩萬多筆資料記錄全部複製到 SQL Server 之「北風貿易」資料庫的「Bulk_Target_章立民工作室」資料表中。
茲將程式碼列示如下,請注意我們使用了兩個連接物件,一個是 OleDbConnection 物件,用以連結至來源資料所在的 Access 資料庫;一個是 SqlConnection 物件,用以連結至目標資料表所在的 SQL Server 資料庫:
Option Strict On
Imports System.Data.OleDb
Imports System.Data.SqlClient
…
Private Sub btnGoBulkCopy_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnGoBulkCopy.Click
Me.btnGoBulkCopy.Enabled = False
' 利用SqlConnectionStringBuilder 物件來構建連接至目標伺服器的連接字串。
Dim sqlconStringBuilder As New SqlConnectionStringBuilder()
sqlconStringBuilder.DataSource = "(local)SQLExpress"
sqlconStringBuilder.InitialCatalog = "北風貿易"
sqlconStringBuilder.IntegratedSecurity = True
' 利用OleDbConnectionStringBuilder 物件來構建連接至來源資料庫的連接字串。
Dim accessStringBuilder As New OleDbConnectionStringBuilder()
accessStringBuilder.DataSource = _
"C:VB2005_IO_Data_SampleDatabase雜匯.mdb"
accessStringBuilder.Provider = "Microsoft.Jet.OLEDB.4.0"
Try
' 建立連結至來源Access 資料庫的連接。
Using con_access As New OleDbConnection(accessStringBuilder.ConnectionString)
' 開啟連結至來源Access 資料庫的連接。
con_access.Open()
' 計算出來源資料表有多少筆資料記錄。
Dim cmdSourceRowCount As New OleDbCommand( _
"SELECT COUNT(*) FROM 章立民工作室;", con_access)
Me.ProgressBar1.Maximum = _
System.Convert.ToInt32(cmdSourceRowCount.ExecuteScalar())
' 建立連結至目標SQL Server 資料庫的連接。
Using con_bulkcopy As New _
SqlConnection(sqlconStringBuilder.ConnectionString)
' 開啟連接至目標SQL Server 的連接。
con_bulkcopy.Open()
' 計算出目標資料表在執行大量複製作業前有多少筆資料記錄。
Dim cmdRowCount As New SqlCommand( _
"SELECT COUNT(*) FROM dbo.Bulk_Target_章立民工作室;", _
con_bulkcopy)
Dim countStart As Long = _
System.Convert.ToInt32(cmdRowCount.ExecuteScalar())
Me.lblRowsCountBeforeBulkCopy.Text = _
"目標資料表在大量複製前擁有的資料筆數= " & countStart.ToString
' 使用oledbDataReader 取得所要複製的來源資料。
Dim cmdSourceData As OleDbCommand = _
New OleDbCommand("SELECT * FROM 章立民工作室", con_access)
Using accessReader As OleDbDataReader = cmdSourceData.ExecuteReader
' 建立一個SqlBulkCopy 物件以便執行大量複製作業。
' 由於來源資料表與目標資料表的所有欄位彼此完全正常對應,
' 所以不需要去對應兩者的欄位。
Using bcp As SqlBulkCopy = New SqlBulkCopy(con_bulkcopy)
AddHandler bcp.SqlRowsCopied, AddressOf OnSqlRowsCopied
bcp.BatchSize = 1000
bcp.BulkCopyTimeout = 60
bcp.NotifyAfter = 1000
' 指定目標資料表的名稱。
bcp.DestinationTableName = "dbo.Bulk_Target_章立民工作室"
' 將來源資料寫入目標資料表。
bcp.WriteToServer(accessReader)
End Using
End Using
' 最後再計算出大量複製了多少筆資料記錄。
Dim countEnd As Long = _
System.Convert.ToInt32(cmdRowCount.ExecuteScalar())
Me.lblRowsCountAfterBulkCopy.Text = _
"本次大量複製的資料筆數= " & (countEnd - countStart).ToString
End Using
End Using
MessageBox.Show("已經完成了大量複製作業")
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
Me.btnGoBulkCopy.Enabled = True
End Sub
Private Sub OnSqlRowsCopied(ByVal sender As Object, _
ByVal args As SqlRowsCopiedEventArgs)
' 更新進度列。
Me.ProgressBar1.Value = CInt(args.RowsCopied)
End Sub