【997755.com澳门葡京】SQLServer中批量插入数据情势的天性比较,关于SQL批量插入数据格局相比

技艺方案一:
削减时间下工程师写出的第二个本子,仅仅为了完结义务,未有从程序上做任何优化,完成格局是利用数据库教程访问类调用存款和储蓄进程,利用循环逐一插入。很显然,这种艺术功用并不高,于是有了前边的两位同事谈论成效低的题材。
能力方案二:
鉴于是思索到大数据量的批量插入,于是自个儿想开了ADO.NET2.0的三个新的风味:SqlBulkCopy。有关这些的性子,很早在此以前自个儿是亲自做过品质测验的,成效极度高。这也是自己向集团同事推荐的本事方案。
工夫方案三:
动用SQLServer二〇〇九的新特性–表值参数(Table-Valued
Parameter)。表值参数是SQLServer二〇〇八才有的一个新特征,使用那个新特征,大家得以把多个表类型作为参数字传送递到函数或存款和储蓄进度里。可是,它也是有一个风味:表值参数在插入数目少于
一千 的行时具备很好的举办质量。
技艺方案四:
对此单列字段,能够把要插入的数额实行字符串拼接,最终再在蕴藏进程中拆分成数组,然后依次插入。查了须臾间囤积进程中参数的字符串的最大尺寸,然后除以字段的长短,算出三个值,很分明是足以满足要求的,只是这种格局跟第一种方法比起来,就像没什么提升,因为原理都以一致的。
技巧方案五:
设想异步成立、音信队列等等。这种方案无论从设计上照旧支付上,难度都是有的。
本事方案一一定是要被否掉的了,剩下的正是在手艺方案二跟本事方案三里头做二个摘取,鉴于公司近期的境况,本领方案四跟才干方案五就先不思量了。
接下去,为了让我们对表值参数的创造跟调用有更感性的认识,笔者将写的更详实些,著作只怕也会稍长些,不关怀细节的情大家得以采纳跳跃式的翻阅格局。
再说一下测验方案吧,测验总共分三组,一组是插入数量低于一千的,此外两组是插入数据量大于一千的(这里我们独家取一千0跟一千000),每组测量检验又分12回,取平均值。如何是好都驾驭了,Let’s
go!

前天清晨快下班的时候,无意中听到公司两位同事在追究批量向数据库插入数据的天性优化难题,登时来了兴趣,把团结的主张向两位同事说了弹指间,于是有了本文。

后日上午快下班的时候,无意中听到公司两位同事在追究批量向数据库插入数据的习性优化难题,立时来了感兴趣,把团结的主张向两位同事说了刹那间,于是有了本文。

1.创建表。

商家本领背景:数据库访问类(xxx.DataBase.Dll)调用存款和储蓄进度达成数据库的造访。

商厦技巧背景:数据库访问类(xxx.DataBase.Dll)调用存款和储蓄进程完毕数据库的拜会。

为了轻巧,表中唯有四个字段,如下图所示:

工夫方案一:

才具方案一:

 

收缩时间下技士写出的第一个版本,仅仅为了成功职务,未有从程序上做其余优化,达成格局是选择数据库访问类调用存款和储蓄进程,利用循环逐个插入。很驾驭,这种格局成效并不高,于是有了前面包车型地铁两位同事批评作用低的难题。

减掉时间下程序猿写出的第一个版本,仅仅为了成功任务,未有从程序上做其他优化,完成方式是应用数据库访问类调用存款和储蓄进度,利用循环逐一插入。很明朗,这种办法效能并不高,于是有了前头的两位同事评论效用低的标题。

2.成立表值参数类型

技艺方案二:

手艺方案二:

作者们开荒查询深入分析器,然后在询问剖析器中进行下列代码:

由于是思量到大数据量的批量布置,于是笔者想到了ADO.NET2.0的八个新的特征:SqlBulkCopy。有关那些的品质,很早在此之前笔者是亲身做过品质测量检验的,功用相当高。那也是本人向同盟社同事推荐的技术方案。

出于是思量到大数据量的批量安排,于是我想开了ADO.NET2.0的三个新的特色:SqlBulkCopy。有关那么些的性质,很早从前作者是亲自做过质量测量试验的,作用相当高。那也是笔者向合营社同事推荐的本领方案。

Create Type PassportTableType as Table
(
PassportKey nvarchar(50)
)实践成功之后,大家开发集团处理器,按梯次依次举办下列节点–数据库、张开可编制程序性、类型、用户自定义表类型,就足以观望我们创造好的表值类型了如下图所示:

技术方案三:

技艺方案三:

 

应用SQLServer2010的新特点–表值参数(Table-Valued
Parameter)。表值参数是SQLServer二〇〇八才有的三个新特色,使用这么些新特色,大家能够把一个表类型作为参数字传送递到函数或存款和储蓄进程里。可是,它也可以有一个表征:表值参数在插入数目少于
1000 的行时具备很好的实行品质。

行使SQLServer二零零六的新特点–表值参数(Table-Valued
Parameter)。表值参数是SQLServer二零一零才有的一个新特色,使用这几个新特色,大家能够把三个表类型作为参数字传送递到函数或存款和储蓄进度里。可是,它也许有一个特征:表值参数在插入数目少于
一千 的行时具备很好的进行品质。

表明大家创制表值类型成功了。

本事方案四:

技艺方案四:

3.编辑存款和储蓄进程

对此单列字段,能够把要插入的数额举行字符串拼接,最后再在仓库储存进度中拆分成数组,然后逐条插入。查了瞬间仓库储存进程中参数的字符串的最大尺寸,然后除以字段的长度,算出多个值,很明显是能够满意须要的,只是这种方法跟第一种办法比起来,仿佛没什么进步,因为原理都是平等的。

对此单列字段,能够把要插入的数额进行字符串拼接,最后再在蕴藏进度中拆分成数组,然后逐条插入。查了一晃积累进程中参数的字符串的最大尺寸,然后除以字段的长度,算出一个值,很明朗是足以满足必要的,只是这种方式跟第一种方法比起来,仿佛没什么升高,因为原理都以一模二样的。

储存进度的代码为:

技巧方案五:

技术方案五:

复制代码 代码如下:
USE [TestInsert]
GO
/****** Object: StoredProcedure [dbo].[CreatePassportWithTVP]
Script Date: 03/02/2010 00:14:45 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
【997755.com澳门葡京】SQLServer中批量插入数据情势的天性比较,关于SQL批量插入数据格局相比。GO
— =============================================
— Author: <Kevin>
— Create date: <2010-3-1>
— Description: <创制通行证>
— =============================================
Create PROCEDURE [dbo].[CreatePassportWithTVP]
@TVP PassportTableType readonly
AS
BEGIN
SET NOCOUNT ON;
Insert into Passport(PassportKey) select PassportKey from @TVP
END

考虑异步创制、音讯队列等等。这种方案无论从统一筹划上照旧支付上,难度都以有的。

思虑异步创制、音信队列等等。这种方案无论从统一企图上也许支付上,难度都以有个别。

兴许在询问剖析器中,智能提醒会提醒表值类型有标题,会冒出法国红下划线(见下图),不用理会,继续运营大家的代码,达成存款和储蓄进程的创始
 
4.编写制定代码调用存款和储蓄进程。
两种数据库的插入方式代码如下,由于时间比较紧,代码只怕不那么易读,非常代码我加了些注释。
复制代码 代码如下:
using System;
using System.Diagnostics;
using System.Data;
using System.Data.SqlClient;
using com.DataAccess;
namespace ConsoleAppInsertTest
{
class Program
{
static string connectionString =
SqlHelper.ConnectionStringLocalTransaction; //数据库连接字符串
static int count = 一千000; //插入的条数
static void Main(string[] args)
{
//long commonInsertRunTime = CommonInsert();
//Console.WriteLine(string.Format(“普通格局插入{1}条数据所用的小运是{0}皮秒”,
commonInsertRunTime, count));
long sqlBulkCopyInsertRunTime = SqlBulkCopyInsert();
Console.WriteLine(string.Format(“使用SqlBulkCopy插入{1}条数据所用的时刻是{0}飞秒”,
sqlBulkCopyInsertRunTime, count));
long TVPInsertRunTime = TVPInsert();
Console.WriteLine(string.Format(“使用表值格局(TVP)插入{1}条数据所用的年华是{0}微秒”,
电视机PInsertRunTime, count));
}
/// <summary>
/// 普通调用存款和储蓄进程插入数据
/// </summary>
/// <returns></returns>
private static long CommonInsert()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
string passportKey;
for (int i = 0; i < count; i++)
{
passportKey = Guid.NewGuid().ToString();
SqlParameter[] sqlParameter = { new SqlParameter(“@passport”,
passportKey) };
SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure,
“CreatePassport”, sqlParameter);
}
stopwatch.Stop();
return stopwatch.Elaps教程edMilliseconds;
}
/// <summary>
/// 使用SqlBulkCopy情势插入数据
/// </summary>
/// <param name=”dataTable”></param>
/// <returns></returns>
private static long SqlBulkCopyInsert()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
DataTable dataTable = GetTableSchema();
string passportKey;
for (int i = 0; i < count; i++)
{
passportKey = Guid.NewGuid().ToString();
DataRow dataRow = dataTable.NewRow();
dataRow[0] = passportKey;
dataTable.Rows.Add(dataRow);
}
SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(connectionString);
sqlBulkCopy.DestinationTableName = “Passport”;
sqlBulkCopy.BatchSize = dataTable.Rows.Count;
SqlConnection sqlConnection = new SqlConnection(connectionString);
sqlConnection.Open();
if (dataTable!=null && dataTable.Rows.Count!=0)
{
sqlBulkCopy.WriteToServer(dataTable);
}
sqlBulkCopy.Close();
sqlConnection.Close();
stopwatch.Stop();
return stopwatch.ElapsedMilliseconds;
997755.com澳门葡京 ,}
private static long TVPInsert()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
DataTable dataTable = GetTableSchema();
string passportKey;
for (int i = 0; i < count; i++)
{
passportKey = Guid.NewGuid().ToString();
DataRow dataRow = dataTable.NewRow();
dataRow[0] = passportKey;
dataTable.Rows.Add(dataRow);
}
SqlParameter[] sqlParameter = { new SqlParameter(“@TVP”, dataTable)
};
SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure,
“CreatePassportWithTVP”, sqlParameter);
stopwatch.Stop();
return stopwatch.ElapsedMilliseconds;
}
private static DataTable GetTableSchema()
{
DataTable dataTable = new DataTable();
dataTable.Columns.AddRange(new DataColumn[] { new
DataColumn(“PassportKey”) });
return dataTable;
}
}
}

本领方案一确定是要被否掉的了,剩下的正是在手艺方案二跟本领方案三之内做三个选项,鉴于公司方今的事态,技艺方案四跟技巧方案五就先不思考了。

手艺方案一料定是要被否掉的了,剩下的便是在技术方案二跟技能方案三时期做一个挑选,鉴于公司近些日子的图景,本领方案四跟本事方案五就先不考虑了。

 

接下去,为了让大家对表值参数的创立跟调用有更感性的认知,笔者将写的更详尽些,小说或许也会稍长些,不敬爱细节的相恋的人们能够挑选跳跃式的翻阅情势。

接下去,为了让我们对表值参数的制造跟调用有更感性的认知,作者将写的更详尽些,小说恐怕也会稍长些,不尊崇细节的情大家能够挑选跳跃式的阅读格局。

比较潜在的代码其实就下边这两行,该代码是将多少个dataTable做为参数字传送给了大家的囤积进程。轻便吗。

再说一下测验方案吗,测量检验总共分三组,一组是插入数量稍差于1000的,其余两组是插入数据量大于一千的(这里大家独家取一千0跟1000000),每组测量检验又分12次,取平均值。如何做都清楚了,Let’s
go!

再说一下测量检验方案吗,测验总共分三组,一组是插入数量稍低于1000的,此外两组是插入数据量大于一千的(这里我们独家取10000跟一千000),每组测量检验又分拾四遍,取平均值。如何做都清楚了,Let’s
go!

SqlParameter[] sqlParameter = { new SqlParameter(“@TVP”, dataTable)
};
SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure,
“CreatePassportWith电视P”,
sqlParameter);5.测量检验并记下测验结果第一组测量检验,插入记录数1000次之组测量检验,插入记录数一千0第三组测量试验,插入记录数一千000因而上述测量试验方案,轻便察觉,手艺方案二的优势依然蛮高的。无论是从通用性依然从性质上牵挂,都应有是
先行被挑选的,还会有点,它的本领复杂度要比技能方案三要轻便一些,
记挂大家把具备表都创造一遍表值类型,专门的学问量依然某些。由此,作者依旧持之以恒自笔者起来时的支配,
向同盟社引用应用第三种手艺方案。

1.创建表。

1.创建表。

压缩时间下技术员写出的首先个本子,仅仅为了成功职责,未有从程序上做其它优化,达成方式是使用数据库教程访问类调用…

为了轻松,表中唯有一个字段,如下图所示:

为了轻易,表中唯有多个字段,如下图所示:

997755.com澳门葡京 1

997755.com澳门葡京 2

2.创造表值参数类型

2.创造表值参数类型

我们开荒查询分析器,然后在询问深入分析器中实行下列代码:

大家开发查询深入分析器,然后在询问解析器中推行下列代码:

Create Type PassportTableType as Table
(
PassportKey nvarchar(50)

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

)

实施成功之后,大家开垦集团处理器,按顺序依次进行下列节点–数据库、张开可编制程序性、类型、用户自定义表类型,就能够看来大家创立好的表值类型了之类图所示:

试行成功之后,大家展开公司管理器,按顺序依次进行下列节点–数据库、张开可编制程序性、类型、用户自定义表类型,就能够看看大家创立好的表值类型了之类图所示:

997755.com澳门葡京 3

997755.com澳门葡京 4

表达大家创造表值类型成功了。

表明大家创造表值类型成功了。

3.编纂存款和储蓄进度

3.编辑存款和储蓄进度

积攒进度的代码为:

仓库储存进程的代码为:

USE [TestInsert]

GO
/****** Object: StoredProcedure [dbo].[CreatePassportWithTVP] Script Date: 03/02/2010 00:14:45 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:    <Kevin>
-- Create date: <2010-3-1>
-- Description:   <创建通行证>
-- =============================================
Create PROCEDURE [dbo].[CreatePassportWithTVP] 

@TVP PassportTableType readonly

AS
BEGIN
SET NOCOUNT ON;

Insert into Passport(PassportKey) select PassportKey from @TVP

END

可能在查询分析器中,智能提示会提示表值类型有问题,会出现红色下划线(见下图),不用理会,
继续运行我们的代码,完成存储过程的创建
USE [TestInsert]

GO
/****** Object: StoredProcedure [dbo].[CreatePassportWithTVP] Script Date: 03/02/2010 00:14:45 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:    <Kevin>
-- Create date: <2010-3-1>
-- Description:   <创建通行证>
-- =============================================
Create PROCEDURE [dbo].[CreatePassportWithTVP] 

@TVP PassportTableType readonly

AS
BEGIN
SET NOCOUNT ON;

Insert into Passport(PassportKey) select PassportKey from @TVP

END

可能在查询分析器中,智能提示会提示表值类型有问题,会出现红色下划线(见下图),不用理会,
继续运行我们的代码,完成存储过程的创建

4.编辑代码调用存款和储蓄进度。

4.编写制定代码调用存款和储蓄进程。

三种数据库的插入方式代码如下,由于时间比较紧,代码大概不那么易读,特别代码小编加了些注释。

二种数据库的插入方式代码如下,由于时间比较紧,代码只怕不那么易读,特别代码作者加了些注释。

997755.com澳门葡京 5997755.com澳门葡京 6主要部分的代码

997755.com澳门葡京 7997755.com澳门葡京 8要害部分的代码

using System;
using System.Diagnostics;
using System.Data;
using System.Data.SqlClient;
using com.DataAccess;

using System;
using System.Diagnostics;
using System.Data;
using System.Data.SqlClient;
using com.DataAccess;

namespace ConsoleAppInsertTest
{
    class Program
    {
        static string connectionString = SqlHelper.ConnectionStringLocalTransaction;    //数据库连接字符串
        static int count = 1000000;           //插入的条数
        static void Main(string[] args)
        {
            //long commonInsertRunTime = CommonInsert();
            //Console.WriteLine(string.Format(“普通形式插入{1}条数据所用的小运是{0}纳秒”, commonInsertRunTime, count));

namespace ConsoleAppInsertTest
{
    class Program
    {
        static string connectionString = SqlHelper.ConnectionStringLocalTransaction;    //数据库连接字符串
        static int count = 1000000;           //插入的条数
        static void Main(string[] args)
        {
            //long commonInsertRunTime = CommonInsert();
            //Console.WriteLine(string.Format(“普通格局插入{1}条数据所用的年月是{0}阿秒”, commonInsertRunTime, count));

            long sqlBulkCopyInsertRunTime = SqlBulkCopyInsert();
            Console.WriteLine(string.Format(“使用SqlBulkCopy插入{1}条数据所用的时日是{0}飞秒”, sqlBulkCopyInsertRunTime, count));

            long sqlBulkCopyInsertRunTime = SqlBulkCopyInsert();
            Console.WriteLine(string.Format(“使用SqlBulkCopy插入{1}条数据所用的年月是{0}纳秒”, sqlBulkCopyInsertRunTime, count));

            long TVPInsertRunTime = TVPInsert();
            Console.WriteLine(string.Format(“使用表值方式(TVP)插入{1}条数据所用的时日是{0}阿秒”, 电视PInsertRunTime, count));
        }

            long TVPInsertRunTime = TVPInsert();
            Console.WriteLine(string.Format(“使用表值格局(TVP)插入{1}条数据所用的年月是{0}飞秒”, 电视机PInsertRunTime, count));
        }

        /// <summary>
        /// 普通调用存款和储蓄进度插入数据
        /// </summary>
        /// <returns></returns>
        private static long CommonInsert()
        {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            
            string passportKey;
            for (int i = 0; i < count; i++)
            {
                passportKey = Guid.NewGuid().ToString();
                SqlParameter[] sqlParameter = { new SqlParameter(“@passport”, passportKey) };
                SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure, “CreatePassport”, sqlParameter);
            }
            stopwatch.Stop();
            return stopwatch.ElapsedMilliseconds;
        }

        /// <summary>
        /// 普通调用存储进度插入数据
        /// </summary>
        /// <returns></returns>
        private static long CommonInsert()
        {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            
            string passportKey;
            for (int i = 0; i < count; i++)
            {
                passportKey = Guid.NewGuid().ToString();
                SqlParameter[] sqlParameter = { new SqlParameter(“@passport”, passportKey) };
                SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure, “CreatePassport”, sqlParameter);
            }
            stopwatch.Stop();
            return stopwatch.ElapsedMilliseconds;
        }

        /// <summary>
        /// 使用SqlBulkCopy格局插入数据
        /// </summary>
        /// <param name=”dataTable”></param>
        /// <returns></returns>
        private static long SqlBulkCopyInsert()
        {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();

        /// <summary>
        /// 使用SqlBulkCopy情势插入数据
        /// </summary>
        /// <param name=”dataTable”></param>
        /// <returns></returns>
        private static long SqlBulkCopyInsert()
        {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();

            DataTable dataTable = GetTableSchema();
            string passportKey;
            for (int i = 0; i < count; i++)
            {
                passportKey = Guid.NewGuid().ToString();
                DataRow dataRow = dataTable.NewRow();
                dataRow[0] = passportKey;
                dataTable.Rows.Add(dataRow);
            }

            DataTable dataTable = GetTableSchema();
            string passportKey;
            for (int i = 0; i < count; i++)
            {
                passportKey = Guid.NewGuid().ToString();
                DataRow dataRow = dataTable.NewRow();
                dataRow[0] = passportKey;
                dataTable.Rows.Add(dataRow);
            }

            SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(connectionString);
            sqlBulkCopy.DestinationTableName = “Passport”;
            sqlBulkCopy.BatchSize = dataTable.Rows.Count;
            SqlConnection sqlConnection = new SqlConnection(connectionString);
            sqlConnection.Open();
            if (dataTable!=null && dataTable.Rows.Count!=0)
            {
                sqlBulkCopy.WriteToServer(dataTable);
            }
            sqlBulkCopy.Close();
            sqlConnection.Close();

            SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(connectionString);
            sqlBulkCopy.DestinationTableName = “Passport”;
            sqlBulkCopy.BatchSize = dataTable.Rows.Count;
            SqlConnection sqlConnection = new SqlConnection(connectionString);
            sqlConnection.Open();
            if (dataTable!=null && dataTable.Rows.Count!=0)
            {
                sqlBulkCopy.WriteToServer(dataTable);
            }
            sqlBulkCopy.Close();
            sqlConnection.Close();

            stopwatch.Stop();
            return stopwatch.ElapsedMilliseconds;
        }

            stopwatch.Stop();
            return stopwatch.ElapsedMilliseconds;
        }

        private static long TVPInsert()
        {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();

        private static long TVPInsert()
        {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();

            DataTable dataTable = GetTableSchema();
            string passportKey;
            for (int i = 0; i < count; i++)
            {
                passportKey = Guid.NewGuid().ToString();
                DataRow dataRow = dataTable.NewRow();
                dataRow[0] = passportKey;
                dataTable.Rows.Add(dataRow);
            }

            DataTable dataTable = GetTableSchema();
            string passportKey;
            for (int i = 0; i < count; i++)
            {
                passportKey = Guid.NewGuid().ToString();
                DataRow dataRow = dataTable.NewRow();
                dataRow[0] = passportKey;
                dataTable.Rows.Add(dataRow);
            }

            SqlParameter[] sqlParameter = { new SqlParameter(“@TVP”, dataTable) };
            SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure, “CreatePassportWithTVP”, sqlParameter);

            SqlParameter[] sqlParameter = { new SqlParameter(“@TVP”, dataTable) };
            SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure, “CreatePassportWithTVP”, sqlParameter);

            stopwatch.Stop();
            return stopwatch.ElapsedMilliseconds;
        }

            stopwatch.Stop();
            return stopwatch.ElapsedMilliseconds;
        }

        private static DataTable GetTableSchema()
        {
            DataTable dataTable = new DataTable();
            dataTable.Columns.AddRange(new DataColumn[] { new DataColumn(“PassportKey”) });
            
            return dataTable;
        }

        private static DataTable GetTableSchema()
        {
            DataTable dataTable = new DataTable();
            dataTable.Columns.AddRange(new DataColumn[] { new DataColumn(“PassportKey”) });
            
            return dataTable;
        }

    }
}

    }
}

相比较暧昧的代码其实就下边这两行,该代码是将叁个dataTable做为参数字传送给了大家的储存进程。轻易吗。

 

SqlParameter[] sqlParameter = { new SqlParameter("@TVP", dataTable) };

SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure, "CreatePassportWithTVP", sqlParameter);

5.测试并记录测试结果

第一组测试,插入记录数1000

第二组测试,插入记录数10000

第三组测试,插入记录数1000000

相比潜在的代码其实就上边这两行,该代码是将叁个dataTable做为参数字传送给了大家的累积进度。轻便吗。

通过以上测量试验方案,简单窥见,技艺方案二的优势依旧蛮高的。无论是从通用性照旧从性质上挂念,都应当是
先行被采取的,还应该有一点,它的手艺复杂度要比技艺方案三要简单一些,

SqlParameter[] sqlParameter = { new SqlParameter("@TVP", dataTable) };

SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure, "CreatePassportWithTVP", sqlParameter);

5.测试并记录测试结果

第一组测试,插入记录数1000

思量我们把全部表都创设三次表值类型,职业量依旧有些。因而,小编照旧坚定不移自小编起来时的支配,
向同盟社引入应用第三种本领方案。

997755.com澳门葡京 9

写到此,本文尽管完了,可是对新手艺的钻研如故还在不停承继。要做的事物依旧挺多的。

第二组测试,插入记录数10000

为了方便我们学习和沟通,代码文件已经打包并上传了,迎接共同学习研究。

997755.com澳门葡京 10

代码下载
第三组测试,插入记录数1000000

997755.com澳门葡京 11因而上述测验方案,简单开掘,本领方案二的优势还是蛮高的。无论是从通用性照旧从质量上思虑,都应该是优先被挑选的,还会有一点点,它的技巧复杂度要比技艺方案三要轻松一些,
设想大家把富有表都成立贰回表值类型,职业量照旧有个别。由此,笔者依然坚定不移自身起来时的垄断,向公司引入应用第三种技艺方案。
写到此,本文尽管完了,不过对新手艺的钻研如故还在一再承继。要做的事物仍旧挺多的。
为了有利于我们学习和调换,代码文件已经打包并上传了,迎接共同学习切磋。

代码下载

 作者:深山老林
出处:
原来的书文地址:

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website