三种批量插入数据的方法

article/2025/9/13 22:58:19

批量插入数据

      本文将介绍三种批量插入数据的方法。第一种方法是使用循环语句逐个将数据项插入到数据库中;第二种方法使用的是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 Table
11 use BulkDB
12 go
13 
14 if exists(select * from sys.objects where object_id=OBJECT_ID(N'[dbo].[BulkTable]') and type in(N'U'))
15 drop table [dbo].BulkTable
16 Create table BulkTable(
17 Id int primary key,
18 UserName nvarchar(32),
19 Pwd varchar(16))
20 go
21 
22 
23 --Create Table Valued
24 use BulkDB
25 go
26 
27 if exists
28 (
29 select * from sys.types st 
30 join sys.schemas ss 
31 on st.schema_id=ss.schema_id
32 where st.name=N'[BulkType]' and ss.name=N'dbo'
33 )
34 drop type [dbo].[BulkType]
35 go
36 
37 create type [dbo].[BulkType] as table
38   (
39    Id int,
40    UserName nvarchar(32),
41    Pwd varchar(16)
42    )
43 go
44 
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 BulkData
10 {
11     class BulkData
12     {
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             try
28             {
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             finally
40             {
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             try
62             {
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             finally
72             {
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             finally
102             {
103                 sqlConn.Close();
104             }
105 
106             Console.ReadLine();
107         }
108     }
109 }

      

       App.config

打开
1 <?xml version="1.0" encoding="utf-8" ?>
2 <configuration>
3   <connectionStrings>
4     <add name="ConnStr"
5       connectionString="data source=.;Integrated Security=SSPI;Initial Catalog=BulkDB"
6       providerName="System.Data.SqlClient" />
7   </connectionStrings>
8 </configuration>

      

       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 BulkData
11 {
12     class Program
13     {            
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


http://chatgpt.dhexx.cn/article/aAQRDOfm.shtml

相关文章

Vue 通过a标签下载文件

vue前端点击某个a便签需要下载对应文件&#xff0c;href为下载路径&#xff0c;download为下载文件名 这是Vue-cli3 写法 因为public文件夹是静态拷贝。 并不要把文件放到src>assets里面 因为assets中的文件会经过 webpack 打包&#xff0c;重新编译。 <a href"./p…

通过 a 标签下载文件

后台管理项目涉及到文件下载到本地&#xff0c;类型包括&#xff08;图片&#xff0c;音频&#xff0c;视频&#xff0c;office文件等等&#xff09;&#xff0c;只需将后台接口提供的url给到 a 标签即可。 <div class"preview-download" click.stop"downLoa…

a标签下载文档 a下载文档失败问题 跨域调用

可以通过a标签下载文档 a中有一个download属性 这个属性可以为空&#xff0c;如果写入的话这是写下载文档的名字 a标签默认下载是在同一个域内&#xff0c;如果跨域的话下载会失败&#xff0c;可能变成预览 出现的问题 from origin ‘http://localhost:8080’ has been blocke…

js使用a标签实现文件下载功能

工作中遇到下载txt文本文件的下载需求&#xff0c;稍作整理&#xff0c;下载示例如下&#xff1a; <button onclick"log()">文件下载</button>// 日志函数 function log() {// dom中创建a标签let aTag document.createElement(a)// 日志展示的内容let c…

JS-a标签下载文件

目录 问题描述解决方法拓展 另一种文件流下载 问题描述 昨天拿到一个需求,就是做成这种下载的模样 后台返回的下载链接长成这样 解决方法 就是一个最普通的方法,创建a标签 ,加上download属性,模拟标签点击 就可以触发下载了 注意:这个是因为直接拿到了请求链接,get请求 co…

HTML中的一些细节处理

# 说明 参考资料:简书的 伴歌知行的JS下载图片和文件&#xff0c;防止浏览器直接打开 、夜半修仙,;CSDN的weixin_3791475的使用a标签下载文件不跳转;努力学习的汪&#xff1a;洪学习笔记 文章目录 # 说明前端利用a标签实现文件[图片]下载文件下载常用方式总结分析Ⅰ-后端设置下…

JAVA中数组和集合的区别

转换 数组转换为集合&#xff1a; Arrays.asList(数组) 示例&#xff1a; 1 2 3 4 5 int[] arr {1,3,4,6,6};//定义一个长度为5数组 Arrays.asList(arr); for(int i0;i<arr.length;i){ System.out.println(arr[i]); } 集合转换为数组&#xff1a; 集合.toArray()…

JAVA中数组和集合的相互转换

数组转集合&#xff1a; 1.遍历&#xff0c;最常用的方法&#xff0c;但是过程会繁琐一点 int arrs[] {1, 2};//1.遍历List<Integer> list new ArrayList<>();for (int ele : arrs) {list.add(ele);}System.out.println(list);2.使用数组工具类的asList()方法 但…

数组与集合的区别及知识拓展

一、数组和集合的区别 1、数组的长度是固定的&#xff0c;一个数组只能存储一种类型的元素&#xff0c;可以存储任意类型。 2、集合的长度是可变的&#xff0c;存储引用数据类型&#xff0c;当存储基本数据类型时需要存储其对应的包装类。 二、知识拓展 1、基本数据类型所对应…

数组和集合的区别及定义方式

数组和集合的定义 一、数组 数组是java语言内置的数据类型&#xff0c;他是一个线性的序列&#xff0c;所有可以快速访问其他的元素&#xff0c;数组和其他语言不同&#xff0c;当你创建了一个数组时&#xff0c;他的容量是不变的&#xff0c;而且在生命周期也是不能改变的&a…

Java的数组与集合

Java的数组与集合 数组1.数组的概念2.数组的定义3.数组的初始化数组静态初始化数组动态初始化数组默认初始化值 4.数组元素访问5.数组的遍历6.数组的内存图JVM的内存图数组的内存图扩展 集合1.集合与数组的比较基本数据类型的包装类 2.集合中的成员方法 数组 1.数组的概念 数组…

数组与集合有什么不同之处

这个问题其实就是一个非常基础的面试题&#xff0c;一般面试官想了解你基础知识方面的掌握时&#xff0c;基本都会问这个问题&#xff0c;尤其是一些&#xff0c;计算机学子毕业之后&#xff0c;如果还是想要从事计算机技术相关的行业时&#xff0c;那么在面试的时候就需要做好…

kotlin数组和集合

一、Kotlin数组 1.对象数组 由Kotlin的main函数的写法&#xff0c;可以看出Kotlin中的对象数组写法与泛型的写法很像。 fun main(args: Array<String>){ } 声明对象数组的三种形式&#xff1a; (1)使用arrayOf函数和指定的数组元素创建数组 //Java写法: String[] p…

Java--数组和集合区别

一、数组 1、Java语言中的数组是一种引用数据类型&#xff1b;不属于基本数据类型 2、数组当中既可以存储“基本数据类型”的数据&#xff0c;也可以存储“引用数据类型”的数据&#xff08;数组既可以存储基本数据类型&#xff0c;又可以存储引用数据类型&#xff0c;基本数…

数组和集合的区别

一、数组声明了它容纳的元素的类型&#xff0c;而集合不声明。 二、数组是静态的&#xff0c;一个数组实例具有固定的大小&#xff0c;一旦创建了就无法改变容量了。而集合是可以动态扩展容量&#xff0c;可以根据需要动态改变大小&#xff0c;集合提供更多的成员方法&#xff…

数组和集合区别

一、数组声明了它容纳的元素的类型&#xff0c;而集合不声明。 二、数组是静态的&#xff0c;一个数组实例具有固定的大小&#xff0c;一旦创建了就无法改变容量了。而集合是可以动态扩展容量&#xff0c;可以根据需要动态改变大小&#xff0c;集合提供更多的成员方法&#xff…

Intellij idea 的tomcat原理讲解

作者: 陈宇超          纪念卓越班的日子 初次用idea的小白可能会很感到很神奇&#xff0c;intellij idea部署web项目在浏览器不需要输入项目名就可以直接访问&#xff0c;很是方便啊。那么 intellij 是如何实现这一功能的呢&#xff1f;在了解其原理之前需要掌握一定的…

Tomcat运行原理

Tomcat服务器本质 Tomcat是运行在JVM中的一个进程。通过处理scoket通信 (Socket) 来运行。Web项目的本质&#xff0c;是一大堆的资源文件和方法。Web项目没有入口方法(main方法)&#xff0c;意味着Web项目中的方法不会自动运行起来。Web项目部署进Tomcat的webapp中&#xff0c…

tomcat原理简要分析,java

tomcat原理 tomcat位置 tomcat实际上是部署在服务器上的&#xff1b; tomcat作用 tomcat服务器是一个Servlet和JSP容器&#xff0c;它响应HTML页面的访问请求。 实际上Tomcat是Apache 服务器的扩展&#xff0c;但运行时它是独立运行的&#xff0c;所以当你运行tomcat 时&#…

谈谈TOMCAT原理和机制

从服务器说起&#xff0c;一台装了操作系统&#xff08;linux、unix、win等等&#xff09;的物理机或者虚拟机不能称之为真正的服务器&#xff0c;因为服务器是能对外界提供服务的计算机&#xff0c;要能成为服务器必须借助其他软件的支持比如:tocmat、apache、IIS、nginx、jet…