12.3批处理载入数据

来源:微软认证    发布时间:2012-11-08    微软认证视频    评论

以往访问 SQL Server 2000 时,若有大量的数据记录需要添加到数据库内,例如从主机系统或是 NCR Teradata、Oracle 等数据库系统下载大量数据记录,我们想要将它们快速添加到 SQL Server 2000中,可以有的选择是调用 T-SQL 的 Bulk Insert 语法、通过 Linked Server 执行 SELECT INTO 语法或是执行 bcp.exe 工具程序,以及通过 DTS 的 Bulk Insert Task 或启动 Transform Data Task 的快速装载(Use Fast Load)设置。但若要通过自行编写的程序完成批次装载,只能以 C/C++ 调用 OLE DB 或 ODBC 的 Bulk API,无法通过 ADO.NET 或 ADO 等对象来执行。

ADO.NET 2.0 的 SqlClient 提供了一个新的类称为 SqlBulkCopy,它让 DataSet 内大量的数据或是 DataReader 通过数据流(Stream)直接读取大量的记录,可以快速将这些记录添加到目的数据库的数据表中。但要注意的是它并非如我们一般用的 bcp.exe 工具程序,可以从某个符号分隔文件读取大量数据,选择性地搭配格式文件(Format File)将记录装载到数据库中,或是将数据库内的数据导出成为一个文件。但由于 DataSet 能集成 XML 数据,因此依然可以采用 SqlBulkCopy 类型,轻松地通过 DataSet 将 XML 文件数据大量转入到数据库。

在此就以一个简单的范例来示范该类的使用方式,我们所设计的范例程序画面如图12-5 所示:

图12-5 从不同的数据库来源或是 XML 文件大量装载记录到目的数据库

在范例中,你可以将来自不同数据源的记录大量装载到目的数据表,程序代码如列表12-5:

程序代码列表12- 5 通过 SqlBulkCopy 对象实例将 DataTable 的内容大量批次更新到数据表

'连接到目的端服务器

Dim destConn As New SqlConnection( _

"SERVER=localhost;DATABASE=AWProductsData;Integrated Security=TRUE")

destConn.Open()

'计算目的端数据表已经存在的记录数目

Dim verifyCmd As New SqlCommand("SELECT COUNT(*) FROM dbo.Products", destConn)

Dim initialCount As Integer = CInt(verifyCmd.ExecuteScalar())

If CheckBox1.Checked Then

'************** ADO.NET 2.0 新增的批次装载记录SqlBulkCopy 类

Using bcp As New SqlBulkCopy(destConn)

bcp.BulkCopyTimeout = 300

bcp.DestinationTableName = "dbo.Products"

'范例中故意让来源端与目的端的数据字段名称不同,因此需要进行字段对应的设置

'若字段名称相同则以下的程序代码可以省略

'bcp.ColumnMappings.Add("ProductID", "ProductID")

'bcp.ColumnMappings.Add("Name", "Name")

'bcp.ColumnMappings.Add("ListPrice", "ListPrice")

bcp.WriteToServer(ds.Tables("Products"))

End Using

Else

Dim adp As New SqlDataAdapter("SELECT * FROM dbo.Products", destConn)

Dim bld As New SqlCommandBuilder(adp)

'ADO.NET 1.1 只提供逐条数据添加

adp.Update(ds.Tables(0))

End If

在上述范例中我们从数据库取出记录放到 DataSet 实例(以此模拟通过 ADO.NET 从不同的数据源读取大量数据后,批次装载到 SQL Server),或是让 DataSet 实例直接读取某个 XML 文件后,再通过 SqlBulkCopy 类实例在指定数据表名称与字段格式后,调用 WriteToServer 方法将数据直接写入到目的数据表。

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答