sqlserver数据库批量插入-SqlBulkCopy

当想在数据库中插入大量数据时,使用insert 不仅效率低,而且会导致一系列的数据库性能问题

当使用insert语句进行插入数据时。我使用了两种方式:

  1. 每次插入数据时,都只插入一条数据库,这个会导致每次插入数据时不断打开关闭数据库链接,导致效率过低(最差)
  2. 使用拼接字符串的方式来进行批量插入数据,但是使用StringBuilder 会占用极大的内存

以上方式对于批量插入数据都不是一个好的选择, 针对这种情况我使用了SqlBulkCopy

sqlbulkCopy:将其它数据源批量加载sqlserver表,就是可以将其它数据源插入到数据库中

示例代码:

创建测试User表:

1 CREATE TABLE [dbo].[Users](
2     [Id] [uniqueidentifier] NOT NULL,
3     [Name] [nvarchar](100) NULL,
4     [Gender] [int] NULL,
5     [Age] [int] NULL,
6     [CityId] [int] NULL,
7     [OpTime] [datetime] NULL,
8     CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED([Id] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
9  ) ON [PRIMARY]

然后定义一个与表映射的Model,因SqlBulkCopy 的特性,定义的 Model 必须拥有与表所有的字段对应的属性:也就是定义的model,需要跟数据表的字段顺序一样,因为转为datatable时会按照顺序插入

 1 public enum Gender
 2 {
 3     Man = 1,
 4     Woman
 5 }
 6
 7 public class User
 8 {
 9     public Guid Id { get; set; }
10     public string Name { get; set; }
11     public Gender? Gender { get; set; }
12     public int? Age { get; set; }
13     public int? CityId { get; set; }
14     public DateTime? OpTime { get; set; }
15 }

制造些数据转为DataTable:

List转为DataTable地址:https://www.cnblogs.com/zhangShanGui/p/12038563.html

 1 List<User> usersToInsert = new List<User>();
 2 usersToInsert.Add(new User() { Id = Guid.NewGuid(), Name = "so1", Gender = Gender.Man, Age = 18, CityId = 1, OpTime = DateTime.Now });
 3 usersToInsert.Add(new User() { Id = Guid.NewGuid(), Name = "so2", Gender = Gender.Man, Age = 19, CityId = 2, OpTime = DateTime.Now });
 4 usersToInsert.Add(new User() { Id = Guid.NewGuid(), Name = "so3", Gender = Gender.Man, Age = 20, CityId = 3, OpTime = DateTime.Now });
 5 usersToInsert.Add(new User() { Id = Guid.NewGuid(), Name = "so4", Gender = Gender.Man, Age = 21, CityId = 4, OpTime = DateTime.Now });
 6
 7 var data = DataTableExtensions.ToDataTable(usersToInsert);
 8  using (SqlBulkCopy bulkCopy = new SqlBulkCopy(ConnectionString))
 9                 {
10                     bulkCopy.DestinationTableName =
11                         "Users";
12                     try
13                     {
14                         bulkCopy.WriteToServer(data, DataRowState.Added);
15                     }
16                     catch (Exception ex)
17                     {
18                         Console.WriteLine(ex.Message);
19                     }
20                 }

原文地址:https://www.cnblogs.com/zhangShanGui/p/12038690.html

时间: 2024-08-11 10:31:55

sqlserver数据库批量插入-SqlBulkCopy的相关文章

DataTable 批量插入SqlServer数据库 使用:SqlBulkCopy

简单使用: private void UpdateTitle(DataTable dt) { if (dt != null && dt.Rows.Count > 0) { using (SqlBulkCopy sbc = new SqlBulkCopy(SqlHelper.connectionString)) { sbc.BatchSize = dt.Rows.Count;//每批次操作数量 sbc.BulkCopyTimeout = 60;//操作允许的超时时间 单位:秒 (超时则

JMeter接口测试-Jmeter向数据库批量插入数据(随机变量的使用)

前言 除了编写Python脚本批量向数据库插入数据以外,今天我们来学习一下如何利用JMeter向mysql数据库批量插入数据吧! 一:添加线程组,添加并配置JDBC Connection Configuration 二:导入mysql驱动包,下载好mysql的驱动包(mysql-connector-java-5.1.22-bin.jar),放到jmeter的lib目录下,选中测试计划,添加mysql驱动包 三:我们需要插入的数据量可以在线程组的线程数.循环次数进行配置,如下,这里只插入10条数据

sqlserver存储过程批量插入数据

在系统中经常会遇到向数据库中批量插入数据情况,存储过程中没有数组,只有通过字符串分割循环插入,下面是一个本人研究的一个例子: create proc [dbo].[Proc_TestBatchMainDetailIns] @mainName nvarchar(50),@detailNameStr nvarchar(max),@detailAgeStr nvarchar(max), @detailRowCount int=1,@tmpFlag int=1,@newMainId int=0 as b

数据库批量插入数据的实践

最近在工作中遇到了一个批量插入数据库表的需求,经过一番研究之后,决定采用 INSERT INTO dbo.OrderInfo ( Content, UserInfoId ) SELECT tb.Content,tb.UserInfoId FROM @table AS tb 这种方法,过程我就不赘述了,这里具体讨论下需要注意的点: 1.要创建一个自定义的表类型,否则插入数据的时候会报错,这里我的语句如下: CREATE TYPE dbo.OrderInfo AS TABLE ( [Content]

使用存储过程向数据库批量插入数据

<一> 前言 最近有个需求,需要向数据库并发批量插入数据. 最开始使用存储过程,类似这样的:  delimiter //   CREATE PROCEDURE load_part_tab()  begin      declare v int default 0;      while v < 8000000      do          insert into part_tab          values (v,'testing partitions',adddate('199

【sqlserver】批量插入10万数据

DECLARE @LN VARCHAR(300),@MN VARCHAR(200),@FN VARCHAR(200)DECLARE @LN_N INT,@MN_N INT,@FN_N INTSET @LN='李王张刘陈杨黄赵周吴徐孙朱马胡郭林何高梁郑罗宋谢唐韩曹许邓萧冯曾程蔡彭潘袁于董余苏叶吕魏蒋田杜丁沈姜范江傅钟卢汪戴崔任陆廖姚方金邱夏谭韦贾邹石熊孟秦阎薛侯雷白龙段郝孔邵史毛常万顾赖武康贺严尹钱施牛洪龚'SET @MN='德绍宗邦裕傅家積善昌世贻维孝友继绪定呈祥大正启仕执必定仲元魁家生先泽远永

Django向数据库批量插入数据

# 如何向数据库一次性插入多条数据 # 方法一:效率极低,不推荐使用 for i in range(1000): models.Book.objects.create(title=f'第{i}本书') # 方法二 # bulk_create book_list = [] for i in range(100000): book_list.append(models.Book(title=f'第{i}本书')) models.Book.objects.bulk_create(book_list)

批量插入 SqlBulkCopy的测试

关于SqlBulkCopy的测试 最近要做.net关于sql大量插入,找到了sqlbulkcopy(自己google下,应该很多说明了)这个好东西,于是测试下性能,用了三个方法对比: 1)直接用ado.net,for循环N次进行单条插入 2)把N条插入语句拼在一个sql,进行插入 3)直接使用sqlbulkcopy进行插入 代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

CI框架 数据库批量插入 insert_batch()

使用CI框架的AR操作:insert_batch()可以减少访问数据库的次数.一次访问即可. 示例1: $data = array( array( 'title' => 'My title' , 'name' => 'My Name' , 'date' => 'My date' ), array( 'title' => 'Another title' , 'name' => 'Another Name' , 'date' => 'Another date' ) ); $