【澳门金沙vip】asp.net 使用SqlBulkCopy极速插入数据到 SQL Server

按这个来算,我们那个发水票的时间就会由 10分钟–20秒,这可太神奇了。
于是乎,下demo,测试,改成自己一般使用的方法测试,NND,还真可以说是极速。
在此贴上我的Demo:SqlBulkCopy.rar 复制代码
代码如下: using System; using System.Diagnostics; using System.Data;
using System.Data.SqlClient; using Microsoft.ApplicationBlocks.Data;
namespace ConsoleAppInsertTest { class Program { static int count =
1000000; //插入的条数 static void Main(string[] args) { long
sqlBulkCopyInsertRunTime = SqlBulkCopyInsert();
Console.WriteLine(string.Format(“使用SqlBulkCopy插入{1}条数据所用的时间是{0}毫秒”,
sqlBulkCopyInsertRunTime, count)); long commonInsertRunTime =
CommonInsert();
Console.WriteLine(string.Format(“普通方式插入{1}条数据所用的时间是{0}毫秒”,
commonInsertRunTime, count)); Console.ReadKey(); } /// summary ///
使用普通插入数据 /// /summary /// returns/returns private static long
CommonInsert() { Stopwatch stopwatch = new Stopwatch();
stopwatch.Start(); for (int i = 0; i count; i++) {
SqlHelper.ExecuteNonQuery(SqlHelper.SqlConnection, CommandType.Text,
“insert into passport(PassportKey) values(‘” + Guid.NewGuid() + “‘)”); }
stopwatch.Stop(); return stopwatch.ElapsedMilliseconds; } /// summary
/// 使用SqlBulkCopy方式插入数据 /// /summary /// returns/returns private
static long SqlBulkCopyInsert() { Stopwatch stopwatch = new Stopwatch();
stopwatch.Start(); DataTable dataTable = GetTableSchema(); for (int i =
0; i count; i++) { DataRow dataRow = dataTable.NewRow(); dataRow[2] =
Guid.NewGuid(); dataTable.Rows.Add(dataRow); }
//Console.WriteLine(stopwatch.ElapsedMilliseconds);//初始化数据时间
SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(SqlHelper.SqlConnection);
sqlBulkCopy.DestinationTableName = “Passport”; if (dataTable != null &&
dataTable.Rows.Count != 0) { sqlBulkCopy.WriteToServer(dataTable); }
sqlBulkCopy.Close(); stopwatch.Stop(); return
stopwatch.ElapsedMilliseconds; } private static DataTable
GetTableSchema() { return
SqlHelper.ExecuteDataset(SqlHelper.SqlConnection, CommandType.Text,
“select * from Passport where 1=2”).Tables[0]; } } }
转自cnblogs的文章 SQL批量插入数据几种方案的性能详细对比

公司技术背景:数据库访问类调用存储过程实现数据库的访问。技术方案一:压缩时间下程序员写出的第一个版本,仅仅为了完成任务,没有从程序上做任何优化,实现方式是利用数据库访问类调用存储过程,利用循环逐条插入。很明显,这种方式效率并不高,于是有了前面的两位同事讨论效率低的问题。技术方案二:由于是考虑到大数据量的批量插入,于是我想到了ADO.NET2.0的一个新的特性:SqlBulkCopy。有关这个的性能,很早之前我是亲自做过性能测试的,效率非常高。这也是我向公司同事推荐的技术方案。技术方案三:利用SQLServer2008的新特性–表值参数。表值参数是SQLServer2008才有的一个新特性,使用这个新特性,我们可以把一个表类型作为参数传递到函数或存储过程里。不过,它也有一个特点:表值参数在插入数目少于
1000
的行时具有很好的执行性能。技术方案四:对于单列字段,可以把要插入的数据进行字符串拼接,最后再在存储过程中拆分成数组,然后逐条插入。查了一下存储过程中参数的字符串的最大长度,然后除以字段的长度,算出一个值,很明显是可以满足要求的,只是这种方式跟第一种方式比起来,似乎没什么提高,因为原理都是一样的。技术方案五:考虑异步创建、消息队列等等。这种方案无论从设计上还是开发上,难度都是有的。技术方案一肯定是要被否掉的了,剩下的就是在技术方案二跟技术方案三之间做一个抉择,鉴于公司目前的情况,技术方案四跟技术方案五就先不考虑了。接下来,为了让大家对表值参数的创建跟调用有更感性的认识,我将写的更详细些,文章可能也会稍长些,不关注细节的朋友们可以选择跳跃式的阅读方式。再说一下测试方案吧,测试总共分三组,一组是插入数量小于1000的,另外两组是插入数据量大于1000的,每组测试又分10次,取平均值。怎么做都明白了,Let’s
go!

1.创建表。

为了简单,表中只有一个字段,如下图所示:

2.创建表值参数类型

我们打开查询分析器,然后在查询分析器中执行下列代码:

Create Type PassportTableType as Table(PassportKey nvarchar(50))

执行成功以后,我们打开企业管理器,按顺序依次展开下列节点–数据库、展开可编程性、类型、用户自定义表类型,就可以看到我们创建好的表值类型了如下图所示: