欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

sqlserver数据库批量插入-SqlBulkCopy

程序员文章站 2022-06-10 16:06:50
当想在数据库中插入大量数据时,使用insert 不仅效率低,而且会导致一系列的数据库性能问题 当使用insert语句进行插入数据时。我使用了两种方式: 以上方式对于批量插入数据都不是一个好的选择, 针对这种情况我使用了SqlBulkCopy sqlbulkCopy:将其它数据源批量加载sqlserv ......

当想在数据库中插入大量数据时,使用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                 }