强烈推荐使用ADO.NET数据库特性

开发 后端
这里就ADO.NET数据库利用SqlBulkCopy类快速写入大批量数据,针对SQL Server的优化,可以写入DataRow数据,文章有详细的介绍,希望看过本文会有技术上的提高。

随着ADO.NET2.0的快速发展,它的功能也有了很大的提高,对于我们运用它的人更方便一些,下面我们就使用SqlBulkCopy批量装载数据(仅限SqlClient)一起来分析研究一下吧。以往访问 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)设置。

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

可以利用SqlBulkCopy类快速写入大批量数据,针对SQL Server的优化,可以写入DataRow数据,DataTable,DataReader,并且可以映射不同的数据列名
◆WriteToServer(DataTable)写入数据表
◆WriteToServer(DataRow[])批次写入数据行
◆WriteToServer(DataTable ,DataRowState)按行状态写入数据库表
◆WriteToServer(IDataReader)写入DataReader对象

下面是个示例:

  1. using (SqlConnection sqlcon = new SqlConnection("Data Source=192.168.80.242;  
  2. user id=oa;  
  3. password=oapassword;  
  4. initial catalog=test")) { sqlcon.Open();   
  5. using (SqlBulkCopy bcp = new SqlBulkCopy(sqlcon)) { bcp.BulkCopyTimeout = 3000;  
  6. bcp.DestinationTableName = "dbo.Test01";   
  7. bcp.ColumnMappings.Add("id", "id"); bcp.ColumnMappings.Add("name1", "name1");  
  8. bcp.ColumnMappings.Add("name2", "name2");   
  9. bcp.ColumnMappings.Add("name3", "name3");  
  10. //映射到不同名列   
  11. bcp.ColumnMappings.Add("changedname4", "name4");  
  12. bcp.WriteToServer(dt); sqlcon.Close(); } } 

但是SqlBulkCopy使用时要注意以下几点:

1 确认确实需要大容量更新在执行此操作,(几十行的数据请尽量使用别的渠道把).

2确认数据一致性,与检查机制,以免遇到主键冲突,数据不符格式等意外。

3 SqlBulkCopy操作可能会导致对目标表元数据的更改(例如,禁用约束检查时)。如果出现这种情况,访问大容量插入表的并发快照隔离事务将失败。

4 SqlBulkCopy将向数据库下大容量更新锁,请注意并发性,以免其他连接因长时间等待而超时。

责任编辑:田树 来源: 博客
相关推荐

2009-11-11 15:09:35

ADO.NET数据集

2009-12-31 09:18:23

ADO.NET对象模型

2009-12-24 09:34:47

调用ADO.NET

2009-12-18 17:06:37

ADO.NET 数据库

2009-12-23 17:59:46

ADO.NET数据库

2009-11-12 10:06:01

ADO.NET读取数据

2009-12-25 17:05:32

ADO.NET数据库

2009-12-28 15:11:36

ADO.NET专家

2009-11-04 13:12:33

VB.NET继承类

2011-10-09 13:38:14

数据库

2009-11-04 15:44:39

ADO.NET Sql

2009-11-04 13:20:28

ADO.NET Dat

2009-12-21 13:59:03

ADO.NET特性

2009-03-12 11:26:35

Data ServicADO.NET.NET

2009-11-04 14:17:34

ADO.NET 2.0

2009-12-31 11:07:33

连接ADO.NET

2009-12-21 16:07:52

ADO.NET数据库

2009-12-22 11:24:37

ADO.NET数据库

2009-12-22 14:21:47

创建ADO.Net

2009-11-12 13:26:56

使用ADO.NET参数
点赞
收藏

51CTO技术栈公众号