sqlserver数据库批量插入-SqlBulkCopy
程序员文章站
2022-06-10 16:06:50
当想在数据库中插入大量数据时,使用insert 不仅效率低,而且会导致一系列的数据库性能问题 当使用insert语句进行插入数据时。我使用了两种方式: 以上方式对于批量插入数据都不是一个好的选择, 针对这种情况我使用了SqlBulkCopy sqlbulkCopy:将其它数据源批量加载sqlserv ......
当想在数据库中插入大量数据时,使用insert 不仅效率低,而且会导致一系列的数据库性能问题
当使用insert语句进行插入数据时。我使用了两种方式:
- 每次插入数据时,都只插入一条数据库,这个会导致每次插入数据时不断打开关闭数据库链接,导致效率过低(最差)
- 使用拼接字符串的方式来进行批量插入数据,但是使用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 }
上一篇: 很多人都说减肥多喝水,这是为什么?
下一篇: Spring笔记 Day03