博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
三种批量插入数据的方法
阅读量:6212 次
发布时间:2019-06-21

本文共 8695 字,大约阅读时间需要 28 分钟。

批量插入数据

      本文将介绍三种批量插入数据的方法。第一种方法是使用循环语句逐个将数据项插入到数据库中;第二种方法使用的是SqlBulkCopy,使您可以用其他源的数据有效批量加载 SQL Server 表;第三种使用的方法是sql server中的表值参数方法,表值参数是 SQL Server 2008 中的新参数类型。表值参数是使用用户定义的表类型来声明的。使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据。

      代码示例:

      此例子为控制台输出程序,有两个类,一个为BulkData类,主要实现了表值参数和sqlbulkcopy是如何插入数据的,一个类为Repository,一个app.config配置文件。所用数据库为sql server 2012。

       建库语句:

    

打开
1 --Create DataBase 2 use master 3 go 4 if exists(select * from master.sys.sysdatabases where name=N'BulkDB') 5 drop database BulkDB 6 create database BulkDB; 7 go 8  9 10 --Create Table11 use BulkDB12 go13 14 if exists(select * from sys.objects where object_id=OBJECT_ID(N'[dbo].[BulkTable]') and type in(N'U'))15 drop table [dbo].BulkTable16 Create table BulkTable(17 Id int primary key,18 UserName nvarchar(32),19 Pwd varchar(16))20 go21 22 23 --Create Table Valued24 use BulkDB25 go26 27 if exists28 (29 select * from sys.types st 30 join sys.schemas ss 31 on st.schema_id=ss.schema_id32 where st.name=N'[BulkType]' and ss.name=N'dbo'33 )34 drop type [dbo].[BulkType]35 go36 37 create type [dbo].[BulkType] as table38   (39    Id int,40    UserName nvarchar(32),41    Pwd varchar(16)42    )43 go44 45 select * from dbo.BulkTable

 

       BulkData.cs

       

打开
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Data; 6 using System.Data.SqlClient; 7 using System.Configuration; 8  9 namespace BulkData10 {11     class BulkData12     {13         public static void TableValuedToDB(DataTable dt)14         {15             SqlConnection sqlConn = new SqlConnection(16               ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString);17             const string TSqlStatement =18              "insert into BulkTable (Id,UserName,Pwd)" +19              " SELECT nc.Id, nc.UserName,nc.Pwd" +20              " FROM @NewBulkTestTvp AS nc";21             SqlCommand cmd = new SqlCommand(TSqlStatement, sqlConn);22             SqlParameter catParam = cmd.Parameters.AddWithValue("@NewBulkTestTvp", dt);23 24             catParam.SqlDbType = SqlDbType.Structured;25            26             catParam.TypeName = "dbo.BulkType";27             try28             {29                 sqlConn.Open();30                 if (dt != null && dt.Rows.Count != 0)31                 {32                     cmd.ExecuteNonQuery();33                 }34             }35             catch (Exception ex)36             {37                 throw ex;38             }39             finally40             {41                 sqlConn.Close();42             }43         }44 45         public static DataTable GetTable()46         {47             DataTable dt = new DataTable();48 49             dt.Columns.AddRange(new DataColumn[]{
new DataColumn("Id",typeof(int)),new DataColumn("UserName",typeof(string)),new DataColumn("Pwd",typeof(string))});50 51 return dt;52 }53 54 public static void BulkToDB(DataTable dt)55 {56 SqlConnection sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString);57 SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn);58 bulkCopy.DestinationTableName = "BulkTable";59 bulkCopy.BatchSize = dt.Rows.Count;60 61 try62 {63 sqlConn.Open();64 if (dt != null && dt.Rows.Count != 0)65 bulkCopy.WriteToServer(dt);66 }67 catch (Exception ex)68 {69 throw ex;70 }71 finally72 {73 sqlConn.Close();74 if (bulkCopy != null)75 bulkCopy.Close();76 }77 }78 }79 }

      

       Repository.cs

打开
1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Text;  5 using System.Data;  6 using System.Data.SqlClient;  7 using System.Configuration;  8 using System.Diagnostics;  9  10 namespace BulkData 11 { 12     public class Repository 13     { 14         public static void UseSqlBulkCopyClass() 15         { 16             Stopwatch sw = new Stopwatch(); 17             for (int outLayer = 0; outLayer < 10; outLayer++) 18             { 19                 DataTable dt = BulkData.GetTable(); 20                 for (int count = outLayer * 100000; count < (outLayer + 1) * 100000; count++) 21                 { 22                     DataRow r = dt.NewRow(); 23                     r[0] = count; 24                     r[1] = string.Format("User-{0}", count * outLayer); 25                     r[2] = string.Format("Password-{0}", count * outLayer); 26                     dt.Rows.Add(r); 27                 } 28                 sw.Start(); 29                 BulkData.BulkToDB(dt); 30                 sw.Stop(); 31                 Console.WriteLine(string.Format("{1} hundred thousand data elapsed Time is {0} Milliseconds", sw.ElapsedMilliseconds, outLayer + 1)); 32             } 33  34             Console.ReadLine(); 35         } 36  37         public static void UseTableValue() 38         { 39             Stopwatch sw = new Stopwatch(); 40  41             for (int outLayer = 0; outLayer < 10; outLayer++) 42             { 43                 DataTable dt = BulkData.GetTable(); 44  45                 for (int count = outLayer * 100000; count < (outLayer + 1) * 100000; count++) 46                 { 47                     DataRow dataRow = dt.NewRow(); 48                     dataRow[0] = count; 49                     dataRow[1] = string.Format("User-{0}", count * outLayer); 50                     dataRow[2] = string.Format("Password-{0}", count * outLayer); 51                     dt.Rows.Add(dataRow); 52                 } 53  54                 sw.Start(); 55                 BulkData.TableValuedToDB(dt); 56                 sw.Stop(); 57  58                 Console.WriteLine(string.Format("{1} hundred thousand data elapsed Time is {0} Milliseconds", sw.ElapsedMilliseconds, outLayer + 1)); 59             } 60  61             Console.ReadLine(); 62         } 63  64         public static void UserNormalInsert() 65         { 66             Stopwatch sw = new Stopwatch(); 67  68             SqlConnection sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString); 69  70             SqlCommand sqlComm = new SqlCommand(); 71             sqlComm.CommandText = string.Format("insert into BulkTable(Id,UserName,Pwd)values(@p0,@p1,@p2)"); 72             sqlComm.Parameters.Add("@p0", SqlDbType.Int); 73             sqlComm.Parameters.Add("@p1", SqlDbType.NVarChar); 74             sqlComm.Parameters.Add("@p2", SqlDbType.VarChar); 75             sqlComm.CommandType = CommandType.Text; 76             sqlComm.Connection = sqlConn; 77             sqlConn.Open(); 78  79             try 80             { 81                 for (int outLayer = 0; outLayer < 10; outLayer++) 82                 { 83                     for (int count = outLayer * 100000; count < (outLayer + 1) * 100000; count++) 84                     { 85  86                         sqlComm.Parameters["@p0"].Value = count; 87                         sqlComm.Parameters["@p1"].Value = string.Format("User-{0}", count * outLayer); 88                         sqlComm.Parameters["@p2"].Value = string.Format("Password-{0}", count * outLayer); 89                         sw.Start(); 90                         sqlComm.ExecuteNonQuery(); 91                         sw.Stop(); 92                     } 93  94                     Console.WriteLine(string.Format("{1} hundred thousand data elapsed Time is {0} Milliseconds", sw.ElapsedMilliseconds, outLayer + 1)); 95                 } 96             } 97             catch (Exception ex) 98             { 99                 throw ex;100             }101             finally102             {103                 sqlConn.Close();104             }105 106             Console.ReadLine();107         }108     }109 }

      

       App.config

打开
1 
2
3
4
7
8

      

       Program.cs

打开
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Data; 6 using System.Data.SqlClient; 7 using System.Configuration; 8 using System.Diagnostics; 9 10 namespace BulkData11 {12     class Program13     {            14         static void Main(string[] args)15         {16             //Repository.UseSqlBulkCopyClass();17             Repository.UseTableValue();18             //Repository.UserNormalInsert();19         }        20     }21 }

      

       三种方法分别插入100万条数据所用的时间为:

       循环语句所用时间:

      

        sqlbulkcopy方法所用时间为:

       

         表值参数所用时间为:

        

转载于:https://www.cnblogs.com/GaoHuhu/archive/2013/04/08/3007206.html

你可能感兴趣的文章
WinForm中跨线程操作控件
查看>>
下MFC中对象、句柄、ID之间的区别.
查看>>
如何构建Win32汇编的编程环境(ONEPROBLEM个人推荐)
查看>>
Flymeos插桩适配教程
查看>>
还在用PS磨皮去皱?看看如何用神经网络高度还原你的年轻容貌!
查看>>
大端模式与小端模式、网络字节顺序与主机字节顺序
查看>>
微信支付申请90%的商户都卡在这儿了,申请微信支付,商户功能设置详细说明...
查看>>
高仿Instagram 页面效果android特效
查看>>
2016 年总结
查看>>
将String转化成Stream,将Stream转换成String
查看>>
java路径Java开发中获得非Web项目的当前项目路径
查看>>
【工具使用系列】关于 MATLAB 遗传算法与直接搜索工具箱,你需要知道的事
查看>>
Kali-linux Arpspoof工具
查看>>
PDF文档页面如何重新排版?
查看>>
基于http协议使用protobuf进行前后端交互
查看>>
bash腳本編程之三 条件判断及算数运算
查看>>
php cookie
查看>>
linux下redis安装
查看>>
弃 Java 而使用 Kotlin 的你后悔了吗?| kotlin将会是最好的开发语言
查看>>
JavaScript 数据类型
查看>>