打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
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                     try13                     {14                         bulkCopy.WriteToServer(data, DataRowState.Added);15                     }16                     catch (Exception ex)17                     {18                         Console.WriteLine(ex.Message);19                     }20                 }
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
.NET高性能框架Chloe.ORM-完美支持MySql
如何把DataTable快速写入数据库
Entity Framework与ADO.NET批量插入数据性能测试
从贫血领域模型重构为充血领域模型
2秒内向数据库中插入十万条数据?微软自带的SqlBulkCopy
SqlBulkCopy批量复制数据
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服