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

  public class Queue
{
public Queue(string content, QueueType type, string officeNumber)
{
Content = content;
Type = type;
OfficeNumber = officeNumber;
} public Queue(DateTime proccessTime, int internalNumber, string content, QueueType type, string officeNumber)
{
ProcessTime = proccessTime;
InternalNumber = internalNumber;
Content = content;
Type = type;
OfficeNumber = officeNumber;
} /// <summary>
/// 处理时间
/// </summary>
public DateTime ProcessTime { get; set; }
/// <summary>
/// 内部编号
/// </summary>
public int InternalNumber { get; set; }
/// <summary>
/// 内容
/// </summary>
public string Content { get; set; }
/// <summary>
/// 信箱类型
/// </summary>
public QueueType Type { get; set; }
/// <summary>
/// 代理人编号
/// </summary>
public string OfficeNumber { get; set; } /// <summary>
/// 判断给出的内容字串是否是有效的信件内容;
/// </summary>
/// <param name="queueContent"></param>
/// <param name="officNumber"> </param>
public static bool Validate(string queueContent, string officNumber)
{
return queueContent.Contains(officNumber);
}
}

实体

         private DataTable GetTableSchema()
{
var dataTable = new DataTable();
dataTable.Columns.AddRange(new[]
{
new DataColumn("ProcessTime"),
new DataColumn("InternalNumber"),
new DataColumn("Content"),
new DataColumn("Type"),
new DataColumn("OfficeNumber"),
});
return dataTable;
}

创建DataTable

         public int Add(System.Collections.Generic.List<Domain.Queue> queues)
{
int rowCount = ;
var dataTable = GetTableSchema(); foreach (var queue in queues)
{
DataRow dataRow = dataTable.NewRow();
dataRow[] = queue.ProcessTime;
dataRow[] = queue.InternalNumber;
dataRow[] = queue.Content;
dataRow[] = queue.Type;
dataRow[] = queue.OfficeNumber;
dataTable.Rows.Add(dataRow);
} using (var sqlConnection = new SqlConnection(ConnectionString))
{
sqlConnection.Open();
using (var sqlBulkCopy = new SqlBulkCopy(sqlConnection))
{
sqlBulkCopy.DestinationTableName = "History.Queues";
sqlBulkCopy.BatchSize = dataTable.Rows.Count;
if (sqlBulkCopy.BatchSize != )
{
sqlBulkCopy.WriteToServer(dataTable);
rowCount = sqlBulkCopy.BatchSize;
}
}
} return rowCount;
}

批量操作

代码分析:

  var sqlBulkCopy = new SqlBulkCopy(sqlConnection)

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

  sqlBulkCopy.WriteToServer(dataTable);

      rowCount = sqlBulkCopy.BatchSize;

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

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

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

  1. Entity Framework与ADO.NET批量插入数据性能测试

    Entity Framework是.NET平台下的一种简单易用的ORM框架,它既便于Domain Model和持久层的OO设计,也提高了代码的可维护性.但在使用中发现,有几类业务场景是EF不太擅长的, ...

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

    一般情况下,我们在向数据库中插入数据时用Insert语句,但是当数据量很大的时候,这种情况就比较缓慢了,这个时候就需要SqlBulkCopy这个类. SqlBulkCopy本身常用的函数有这么几个 D ...

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

    转自:http://blog.csdn.net/huaer1011/article/details/2312361 在.Net1.1中无论是对于批量插入整个DataTable中的所有数据到数据库中,还 ...

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

    在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题.下面介绍SQL Server支持的两种批量 ...

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

    我的新书ASP.NET MVC企业级实战预计明年2月份出版,感谢大家关注! 本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的 ...

  6. C#批量插入数据到Sqlserver中的三种方式

    本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生 成 ...

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

    先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生成一个GUID算法所花的时间肯定比你从数据表中重新查询上一条记 ...

  8. IBatis.Net 批量插入数据

    利用了iterate标签来做的: 先看iterate标签几个属性的: prepend-加在open指定的符号之前的符号,添加在语句的前面(可选) property-类型为ArrayList的用于遍历的 ...

  9. 使用EF扩展EntityFramework.BulkInsert实现批量插入

    EntityFramework 最被人诟病的地方就是它的性能,处理大量数据时的效率.此种条件下,通常会转回使用 ADO.NET 来完成任务.而EntityFramework.BulkInsert则是利 ...

随机推荐

  1. Hive学习笔记:基础语法

    Hive基础语法 1.创建表 – 用户表 CREATE [EXTERNAL外部表] TABLE [IF NOT EXISTS 是否存在] HUserInfo ( userid int comment ...

  2. 摄影EV值深入研究

    1. 什么是EV值 1.1. EV值定义 EV(Exposure Value),曝光值,是反应曝光量的一个值.当感光度为ISO 100.光圈值为F1.曝光时间为1秒时,定义曝光量为0.曝光量减少一档时 ...

  3. 【转】Linux进程绑CPU核

    1. 什么是绑核? 所谓绑核,其实就是设定某个进程/线程与某个CPU核的亲和力(affinity).设定以后,Linux调度器就会让这个进程/线程只在所绑定的核上面去运行.但并不是说该进程/线程就独占 ...

  4. pandas练习(四)--- 应用Apply函数

    探索学生对酒的消费情况 数据见github 步骤1 - 导入必要的库 import pandas as pd import numpy as np 步骤2 - 数据集 path4 = "./ ...

  5. Hive 复制分区表和数据

    1. 非分区表: 复制表结构: create table new_table as select * from exists_table where 1=0; 复制表结构和数据: create tab ...

  6. 应用程序无法正常启动0xc000007b怎么解决

    解决方法两种: 1. 网上搜索中最常见的,缺少DirectX 9 ,去下载一个安上就OK了. 2.第二种情况比较操蛋,其实报的错误应该是:mfc100u.dll丢失 .我在两台电脑上装了相同系统后,台 ...

  7. python3.4学习笔记(九) Python GUI桌面应用开发工具选择

    python3.4学习笔记(九) Python GUI桌面应用开发工具选择 Python GUI开发工具选择 - WEB开发者http://www.admin10000.com/document/96 ...

  8. 关于QStandardItemModel

    类QabstractItemModel,QabstractListModel,QAbstractTableModel不保存数据,用户需要从这些类派生出子类,并在子类中定义某种数据结构来保存数据.与此不 ...

  9. java程序初始化顺序

    使用场景:  在java程序中,当实例化对象时,对象的所在类的所有成员变量首先要进行初始化,只有当所有类成员完成初始化后, 才会调用对象所在类的构造函数创建对象. 初始化的原则: (1)静态对象优先于 ...

  10. python函数—形参、实参、位置参数、关键字参数

    1.通过def function_name([parameter]): 定义,函数一遇到return即结束运行.如果函数没有定义返回值,则返回None,如果定义了一个返回值,则返回该对象,如果一个re ...