好多天没写博客了,刚刚毕业一个多月!

关于上一篇博客中提到的,在进行批量数据插入数据库的时候可以通过给存储过程传递一个类型为Table的参数进行相关操作,在这个过程中本人没有进行效率的测试。后来查找发现可以通过SqlBulkCopy类进行大数据插入操作,本文就来介绍一个这个类的作用并做了相关的效率测试(与Insert语句进行对比)。

SqlBulkCopy只能向SqlServer表写入数据,该表既可以是同一个服务器上的也可以是远程服务器上的。当然要写入的数据即数据源不单单是SqlServer,可以是任何数据源,只要数据可以加载到DataTable中或者DataReader可以读取的数据。

SqlBulkCopy类批量插入数据代码如下:

1.先创建一个User类,对应数据库的User表。

 public class User
{
public User()
{ }
public string UserName { get; set; }
public string PassWord { get; set; }
public string Address { get; set; }
public string Telephone { get; set; }
}

数据库User表结构:

2.创建一个返回存储了一万条数据的DataTable方法:

     protected DataTable GetDataTableData()
{
List<User> userList=new List<User>();
for (int i = ; i < ; i++)
{
User user=new User();
user.UserName = "zhangsan";
user.PassWord = "";
user.Address = "北京路一号";
user.Telephone = "";
userList.Add(user);
}
using (DataTable dt = new DataTable())
{
dt.Columns.Add("UserName", typeof (string));
dt.Columns.Add("PassWord", typeof(string));
dt.Columns.Add("Address", typeof(string));
dt.Columns.Add("Telephone", typeof(string));
foreach (User user in userList)
{
DataRow dr = dt.NewRow();
dr["UserName"] = user.UserName;
dr["PassWord"] = user.PassWord;
dr["Address"] = user.Address;
dr["Telephone"] = user.Telephone;
dt.Rows.Add(dr);
}
return dt;
}
}

3.在页面上放了一个按钮,点击该按钮便可进行数据的插入操作,按钮点击事件代码如下:

     protected void Button1_Click(object sender, EventArgs e)
{
string conStr = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString;
SqlConnection connection=new SqlConnection(conStr);
try
{
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conStr, SqlBulkCopyOptions.KeepIdentity|SqlBulkCopyOptions.UseInternalTransaction))
{
bulkCopy.DestinationTableName = "dbo.[User]";//目标表,就是说您将要将数据插入到哪个表中去
bulkCopy.ColumnMappings.Add("UserName", "UserName");//数据源中的列名与目标表的属性的映射关系
bulkCopy.ColumnMappings.Add("PassWord", "PassWord");
bulkCopy.ColumnMappings.Add("Address", "Address");
bulkCopy.ColumnMappings.Add("Telephone", "Telephone");
DataTable dt = GetDataTableData();//数据源数据
//bulkCopy.BatchSize = 3;
Stopwatch stopwatch=new Stopwatch();//跑表,该类可以进行时间的统计
stopwatch.Start();//跑表开始
bulkCopy.WriteToServer(dt);//将数据源数据写入到目标表中
Response.Write("插入数据所用时间:"+stopwatch.Elapsed);//跑表结束,Elapsed是统计到的时间
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
Response.Write("<br/>插入成功!!!");
}

SqlServer中通过Insert语句批量插入数据的代码如下:

1.首先创建一个插入一万条数据的存储过程,插入的数据与SqlBulkCopy插入的数据一模一样。

 CREATE PROC USP_InsertUserTable
AS
BEGIN
DECLARE @i INT
SET @i=
WHILE @i<
BEGIN
INSERT INTO dbo.[User]
( UserName ,
PassWord ,
Address ,
Telephone
)
VALUES ( N'zhangsan' , -- UserName - nvarchar()
N'' , -- PassWord - nvarchar()
N'北京路一号' , -- Address - nvarchar()
'' -- Telephone - varchar()
) SET @i=@i+
END
END

2.执行存储过程。
EXEC dbo.USP_InsertUserTable

SqlBulkCopy与Insert语句效率测试对比如下:

SqlBulkCopy所用时间统计(5次):

SqlServer Insert语句所用时间统计(5次),通过工具--》Sql Server Profiler进行测试,使用的模板是TSQL_Duration:

有一点需要注意的:无论是SqlBulkCopy还是Insert语句进行操作,每次测试前都应该进行缓冲区清理以及删除原有数据,以免对测试进行影响,代码如下:

DBCC DROPCLEANBUFFERS
DBCC FREESYSTEMCACHE( 'ALL' )
DELETE dbo.[User]

结论:通过以上的统计分析测试,可以看出SqlBulkCopy操作大数据插入的效率性能明显比Insert语句更高效。

本人才疏学浅,哪里有不对的欢迎指出。

SqlBulkCopy类进行大数据(一万条以上)插入测试的更多相关文章

  1. SqlBulkCopy类进行大数据(10000万条以上)插入测试

    好多天没写博客了,刚刚毕业一个多月,在IT的路上真是迷茫啊! 关于上一篇博客中提到的,在进行批量数据插入数据库的时候可以通过给存储过程传递一个类型为Table的参数进行相关操作,在这个过程中本人没有进 ...

  2. 转:SqlBulkCopy类进行大数据(一万条以上)插入测试

    转自:https://www.cnblogs.com/LenLi/p/3903641.html 结合博主实例,自己测试了一下,把数据改为3万行更明显!! 关于上一篇博客中提到的,在进行批量数据插入数据 ...

  3. [lua, mysql] 将多条记录数据组合成一条sql插入语句(for mysql)

    -- 演示将多条记录数据组合成一条sql插入语句(for mysql) function getTpl0(tname) -- 获取表各个字段 local t = { tpl_pack = {" ...

  4. C# SqlBulkCopy类批量导入数据

    特别注意  sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName); 插入的时候列的顺序可 ...

  5. 用.net中的SqlBulkCopy类批量复制数据 (转载)

    在软件开发中,把数据从一个地方复制到另一个地方是一个普遍的应用. 在很多不同的场合都会执行这个操作,包括旧系统到新系统的移植,从不同的数据库备份数据和收集数据. .NET 2.0有一个SqlBulkC ...

  6. 使用asp.net 2.0中的SqlBulkCopy类批量复制数据

    介绍:在软件开发中,把数据从一个地方复制到另一个地方是一个普遍的应用. 在很多不同的场合都会执行这个操作,包括旧系统到新系统的移植,从不同的数据库备份数据和收集数据. ASP.NET 2.0有一个Sq ...

  7. C# 使用 SqlBulkCopy 类批量复制数据到数据库

    最近公司需要优化导入的问题,由于之前使用的方式是生成 Insert 语句插入数据库,数据量小的时候还行,但是随着发展数据量渐渐大了,之前的方法性能就跟不上了,于是发现了 SqlBulkCopy 这个类 ...

  8. JAVA基础之基本类型包装类、System类、Math类、Arrays类及大数据运算

    个人理解: 为了方便运算及调用一些方法,我们需要将基本类型的数值转换为对象:不过转换的时候需要特别注意好它们的类型到底是什么,需要调用方法的类名是哪个!特别注意是Byte常量池的相关问题(==):gc ...

  9. 基本类型包装类、System类、Math类、Arrays类、大数据运算

    1 基本类型包装类 Java中想对8种基本数据类型进行复杂操作很困难. 实际程序界面上用户输入的数据都是以字符串类型进行存储的. 程序开发中,需要把字符串转换成指定的基本数据类型. 1.1基本数据类型 ...

随机推荐

  1. FineUI控件之树的应用(二)

    一.Tree控件应用 <f:PageManager ID="PageManager1" runat="server" /> <f:Tree I ...

  2. linux oracle 设置随系统自动启动数据库实例和监听

    在root账户下修改/etc/oratab 文件: # vi /etc/oratab 找到orcl=/db/app/oracle/product/11.1.0/db_1 :N这一行 改为: orcl= ...

  3. C#重写Equals方法步骤

    检查传入的参数是否为null, 如果为null,那么返回false, 否则执行步骤2 调用ReferenceEquals查看是否为统一个对象,如果是,那么返回true, 否则执行步骤3 判断两者是否为 ...

  4. 宏定义中使用do{}while(0)的好处 (转载)

    宏定义中使用do{}while(0)的好处   #define MACRO_NAME(para) do{macro content}while(0)   的格式,总结了以下几个原因:   1,空的宏定 ...

  5. BestCoder Round #36 (hdu5199)Gunner(水题)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Gunner Time Limit: 8000/4000 MS (Java/Oth ...

  6. CentoS7装机

    按delete进入BIOS 选择UEFI 网上关于CentOS 7 的安装教程挺多的,但在前期的引导配置上很多都没有写清楚,让人很郁闷,以致于昨天安装的时候总是到不了安装界面.经过一番胡乱倒腾,终于找 ...

  7. Kendo Web UI Grid里时间格式转换

    我和大家分享一下我的kendo的学习心得.如果不好的地方多多包含或者给我留言请看图 kendo里时间格式如图Oder Date列里的格式.但是我们想把时间转换成中国人习惯的格式.如Shipped Da ...

  8. C# 向批处理文件输入字符

    先记录个无关标题哒~ 刚刚学习用C#,在用VS进行图形界面编程时,点界面中添加的空间,VS界面右侧会出现该控件的属性页,但是这个属性页并不全, 只列出了部分重要的属性,一开始还以为是没有对应的属性方法 ...

  9. ASP.NET MVC DefaultModelBinder

    转载自 Leo‘s Blog 看到很多ASP.NET MVC项目还在从request.querystring或者formContext里面获取数据,这实在是非常落后的做法.也有的项目建了大量的自定义的 ...

  10. mysql 5.7 内存使用监控

    5.7 中的performance_schema 已经有能力监控mysql 的内存使用情况了,对于这一点也是要通过instrument 来实现的,由于内存这一块没有对应的consumer 所以只要 配 ...