前端应用程序实现不同数据库之间的表复制

使用SqlBulkCopy进行数据复制
本文介绍如何使用SqlBulkCopy对象将Access数据库中的大量数据高效地复制到SQL Server数据库中。通过具体代码示例展示了从连接数据库到完成数据复制的整个过程。

许多人都有一个疑问,那就是不知道该如何于前端应用程序中完成数据库之间的大量复制作业。在此我们要示范如何使用 SqlBulkCopy 对象来完成大量复制作业,它会将 Access 数据库「汇整.mdb」之「章立民工作室」的两万多笔数据记录全部复制到 SQL Server 之「北风贸易」数据库的「Bulk_Target_章立民工作室」数据表中。

兹将程序代码列示如下,请注意我们使用了两个连接对象,一个是 OleDbConnection 对象,用以连结至来源数据所在的 Access 数据库;一个是 SqlConnection 对象,用以连结至目标数据表所在的 SQL Server 数据库:

OptionStrictOn
Imports
System.Data.OleDb
Imports System.Data.SqlClient



PrivateSub btnGoBulkCopy_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnGoBulkCopy.Click
Me.btnGoBulkCopy.Enabled = False

' 利用SqlConnectionStringBuilder 对象来构建连接至目标服务器的连接字符串。
Dim sqlconStringBuilder AsNew SqlConnectionStringBuilder()
sqlconStringBuilder.DataSource =
"(local)SQLExpress"
sqlconStringBuilder.InitialCatalog = "北风贸易"
sqlconStringBuilder.IntegratedSecurity = True

' 利用OleDbConnectionStringBuilder 对象来构建连接至来源数据库的连接字符串。
Dim accessStringBuilder AsNew OleDbConnectionStringBuilder()
accessStringBuilder.DataSource = _
"C:VB2005_IO_Data_SampleDatabase杂汇.mdb"
accessStringBuilder.Provider = "Microsoft.Jet.OLEDB.4.0"

Try
' 建立连结至来源Access 数据库的连接。
Using con_access AsNew OleDbConnection(accessStringBuilder.ConnectionString)

' 开启连结至来源Access 数据库的连接。
con_access.Open()

' 计算出来源数据表有多少笔数据记录。
Dim cmdSourceRowCount AsNew OleDbCommand( _
"SELECT COUNT(*) FROM 章立民工作室;", con_access)

Me.ProgressBar1.Maximum = _
System.Convert.ToInt32(cmdSourceRowCount.ExecuteScalar())

' 建立连结至目标SQL Server 数据库的连接。
Using con_bulkcopy AsNew _
SqlConnection(sqlconStringBuilder.ConnectionString)

' 开启连接至目标SQL Server 的连接。
con_bulkcopy.Open()

' 计算出目标数据表在执行大量复制作业前有多少笔数据记录。
Dim cmdRowCount AsNew SqlCommand( _
"SELECT COUNT(*) FROM dbo.Bulk_Target_章立民工作室;", _
con_bulkcopy)
Dim countStart AsLong = _
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)

EndUsing
EndUsing

' 最后再计算出大量复制了多少笔数据记录。
Dim countEnd AsLong = _
System.Convert.ToInt32(cmdRowCount.ExecuteScalar())
Me.lblRowsCountAfterBulkCopy.Text = _
"本次大量复制的数据笔数= " & (countEnd - countStart).ToString

EndUsing
EndUsing
MessageBox.Show("已经完成了大量复制作业")
Catch ex As Exception
MessageBox.Show(ex.Message)
EndTry

Me.btnGoBulkCopy.Enabled = True
End
Sub

Private
Sub OnSqlRowsCopied(ByVal sender AsObject, _
ByVal args As SqlRowsCopiedEventArgs)
' 更新进度列。
Me.ProgressBar1.Value = CInt(args.RowsCopied)
EndSub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值