• 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                 }
  • 相关阅读:
    你可能不知道的js -- 数据类型转换
    项目开发过程中使用工具的相关配置 -- git / svn / 谷歌跨域
    博客园个人博客页面主题
    keep-alive指定条件缓存的坑
    element的多文件上传
    谷歌应用商店扩展程序
    从郭建的遭遇(自称最惨的创业者)看‘程序员的人生观’(一)
    我深表遗憾
    入门学习三
    编程入门学习二
  • 原文地址:https://www.cnblogs.com/zhangShanGui/p/12038690.html
Copyright © 2020-2023  润新知