当前位置: 移动技术网 > IT编程>开发语言>c# > sqlserver数据库批量插入-SqlBulkCopy

sqlserver数据库批量插入-SqlBulkCopy

2019年12月14日  | 移动技术网IT编程  | 我要评论

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网