ADO.NET 批量插入

在.Net1.1中无论是对于批量插入整个DataTable中的所有数据到数据库中,还是进行不同数据源之间的迁移,都不是很方便。而 在.Net2.0中,SQLClient命名空间下增加了几个新类帮助我们通过DataTable或DataReader批量迁移数据。数据源可以来自关 系数据库或者XML文件,甚至WebService返回结果。其中最重要的一个类就是SqlBulkCopy类,使用它可以很方便的帮助我们把数据源的数 据迁移到目标数据库中。

 1  public class Queue
 2     {
 3         public Queue(string content, QueueType type, string officeNumber)
 4         {
 5             Content = content;
 6             Type = type;
 7             OfficeNumber = officeNumber;
 8         }
 9
10         public Queue(DateTime proccessTime, int internalNumber, string content, QueueType type, string officeNumber)
11         {
12             ProcessTime = proccessTime;
13             InternalNumber = internalNumber;
14             Content = content;
15             Type = type;
16             OfficeNumber = officeNumber;
17         }
18
19         /// <summary>
20         /// 处理时间
21         /// </summary>
22         public DateTime ProcessTime { get; set; }
23         /// <summary>
24         /// 内部编号
25         /// </summary>
26         public int InternalNumber { get; set; }
27         /// <summary>
28         /// 内容
29         /// </summary>
30         public string Content { get; set; }
31         /// <summary>
32         /// 信箱类型
33         /// </summary>
34         public QueueType Type { get; set; }
35         /// <summary>
36         /// 代理人编号
37         /// </summary>
38         public string OfficeNumber { get; set; }
39
40         /// <summary>
41         /// 判断给出的内容字串是否是有效的信件内容;
42         /// </summary>
43         /// <param name="queueContent"></param>
44         /// <param name="officNumber"> </param>
45         public static bool Validate(string queueContent, string officNumber)
46         {
47             return queueContent.Contains(officNumber);
48         }
49     }

实体

 1         private DataTable GetTableSchema()
 2         {
 3             var dataTable = new DataTable();
 4             dataTable.Columns.AddRange(new[]
 5                                            {
 6                                                new DataColumn("ProcessTime"),
 7                                                new DataColumn("InternalNumber"),
 8                                                new DataColumn("Content"),
 9                                                new DataColumn("Type"),
10                                                new DataColumn("OfficeNumber"),
11                                            });
12             return dataTable;
13         }

创建DataTable

 1         public int Add(System.Collections.Generic.List<Domain.Queue> queues)
 2         {
 3             int rowCount = 0;
 4             var dataTable = GetTableSchema();
 5
 6             foreach (var queue in queues)
 7             {
 8                 DataRow dataRow = dataTable.NewRow();
 9                 dataRow[0] = queue.ProcessTime;
10                 dataRow[1] = queue.InternalNumber;
11                 dataRow[2] = queue.Content;
12                 dataRow[3] = queue.Type;
13                 dataRow[4] = queue.OfficeNumber;
14                 dataTable.Rows.Add(dataRow);
15             }
16
17             using (var sqlConnection = new SqlConnection(ConnectionString))
18             {
19                 sqlConnection.Open();
20                 using (var sqlBulkCopy = new SqlBulkCopy(sqlConnection))
21                 {
22                     sqlBulkCopy.DestinationTableName = "History.Queues";
23                     sqlBulkCopy.BatchSize = dataTable.Rows.Count;
24                     if (sqlBulkCopy.BatchSize != 0)
25                     {
26                         sqlBulkCopy.WriteToServer(dataTable);
27                         rowCount = sqlBulkCopy.BatchSize;
28                     }
29                 }
30             }
31
32             return rowCount;
33         }

批量操作

代码分析:

  var sqlBulkCopy = new SqlBulkCopy(sqlConnection)

先生成SqlBulkCopy 实例,构造函数指定了目标数据库,使用sqlConnection链接创建

  sqlBulkCopy.WriteToServer(dataTable);

      rowCount = sqlBulkCopy.BatchSize;

  rowCount  属性指定通知通知事件前处理的数据行数

  WriteToServer方法就是将数据源拷备到目标数据库。在使用WriteToServer方法之前必须先指定 DestinationTableName属性,也就是目标数据库的表名,

时间: 2024-08-09 06:30:17

ADO.NET 批量插入的相关文章

传智播客--ADO.net--SqlBulkCopy批量插入数据(小白必知)

一般情况下,我们在向数据库中插入数据时用Insert语句,但是当数据量很大的时候,这种情况就比较缓慢了,这个时候就需要SqlBulkCopy这个类. SqlBulkCopy本身常用的函数有这么几个 DestinationTableName-----服务器目标表上的名称,也就是你要向哪个表插入大量的数据,这个就设置为那个表名 ColumnMappings-----字段映射,因为是要在本地建立一个Table,然后将整个Table一次性的加入到数据库中,因此需要将本地的Table的字段和数据库表中的字

ADO.net--SqlBulkCopy批量插入数据

一般情况下,我们在向数据库中插入数据时用Insert语句,但是当数据量很大的时候,这种情况就比较缓慢了,这个时候就需要SqlBulkCopy这个类. SqlBulkCopy本身常用的函数有这么几个 DestinationTableName-----服务器目标表上的名称,也就是你要向哪个表插入大量的数据,这个就设置为那个表名 ColumnMappings-----字段映射,因为是要在本地建立一个Table,然后将整个Table一次性的加入到数据库中,因此需要将本地的Table的字段和数据库表中的字

ADO.NET 新特性之SqlBulkCopy(批量插入大量数据)

转自:http://blog.csdn.net/huaer1011/article/details/2312361 在.Net1.1中无论是对于批量插入整个DataTable中的所有数据到数据库中,还是进行不同数据源之间的迁移,都不是很方便.而在.Net2.0中,SQLClient命名空间下增加了几个新类帮助我们通过DataTable或DataReader批量迁移数据.数据源可以来自关系数据库或者XML文件,甚至WebService返回结果.其中最重要的一个类就是SqlBulkCopy类,使用它

【ADO.NET-中级】百万级数据的批量插入的两种方法测试

在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题.下面介绍SQL Server支持的两种批量数据插入方法:Bulk和表值参数(Table-Valued Parameters). 运行下面的脚本,建立测试数据库和表值参数. --Create DataBase create database BulkTestDB; Go use BulkTestDB; go --Create Table Cr

SQL批量插入表类 SqlBulkInsert

ado.net已经有了sqlBulkCopy, 但是那个用xml格式,网络传输数据量太大. 自己实现了一个,传输尽量少的字节. 性能没对比过,有需要的自己拿去测试. 1 using System.Data.SqlClient; 2 3 namespace RaywindStudio.DAL { 4 5 /// <summary> 6 /// MSSQL批量插入表 7 /// </summary> 8 public static class SqlBulkInsert { 9 10

C#_批量插入数据到Sqlserver中的四种方式

先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生成一个GUID算法所花的时间肯定比你从数据表中重新查询上一条记录的ID的值然后再进行加1运算要少.而如果存在索引的情况下,每次插入记录都会进行索引重建,这是非常耗性能的.如果表中无可避免的存在索引,我们可以通过先删除索引,然后批量插入,最后再重建索引的方式来提高效率. create database CarSYS;    go    use CarSYS;  

EF实现批量插入

Z.EntityFramework.BulkInsert EntityFramework 最被人诟病的地方就是它的性能,处理大量数据时的效率.此种条件下,通常会转回使用 ADO.NET 来完成任务.而EntityFramework.BulkInsert则是利用了Microsoft SQL Server的SqlBulkCopy 接口,实现了批量插入数据时的高效率. 在网上找到两篇相关的帖子,分别是: (1)http://www.cnblogs.com/gaochundong/p/entity_fr

mysql使用存储过程&amp;函数实现批量插入

写这边文章的目的,是想结合mysql 存储过程+函数完成一个批量删除的功能吧...正好也好加深下对procedure和function的熟练操作吧...废话不多说,我就直接上表结构啦哈,如下: create table dept( id int unsigned primary key auto_increment, deptno mediumint unsigned not null default 0, dname varchar(20) not null default "",

spring JdbcTemplate批量插入以及单个插入时获取id

1. 批量更新插入 jdbcTemplate.batchUpdate(String sql, List<Object[]> batchArgs) Object[]数组的长度为每条记录的参数个数(也就是sql语句中"?"的个数) List: 总共插入多少条记录. /** * 批量插入订单详情 * */ public void addBatch(List<OrderDetail> orderDetails) { List<Object[]> params