VIsual Basic 2005 - 如何使用 SqlBulkCopy 物件來執行大量複製作業

摘要: 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