zoukankan      html  css  js  c++  java
  • sqlbulkcopy 批量插入数据

    批量插入 Datetable数据  通过sqlbulkcopy 插入1百万条数据 用时 10秒钟 (有兴趣的小伙伴可以去测试)

     1   /// <summary>
     2         /// 
     3         /// </summary>
     4         /// <param name="connectionStr">连接字符串</param>
     5         /// <param name="dataTableName">数据库表名称</param>
     6         /// <param name="sourceDataTable"></param>
     7         /// <param name="batchSize"></param>
     8         public static void SqlBulkCopyByDataTable(string connectionStr, string dataTableName, DataTable sourceDataTable, int batchSize = 100000)
     9         {
    10             using (SqlConnection connection = new SqlConnection(connectionStr))
    11             {
    12                 using (System.Data.SqlClient.SqlBulkCopy sqlBulkCopy = new System.Data.SqlClient.SqlBulkCopy(connectionStr, SqlBulkCopyOptions.UseInternalTransaction))
    13                 {
    14                     try
    15                     {
    16                         sqlBulkCopy.DestinationTableName = dataTableName;
    17                         sqlBulkCopy.BatchSize = batchSize;
    18                         for (int i = 0; i < sourceDataTable.Columns.Count; i++)
    19                         {
    20                             sqlBulkCopy.ColumnMappings.Add(sourceDataTable.Columns[i].ColumnName, sourceDataTable.Columns[i].ColumnName);
    21                         }
    22                         sqlBulkCopy.WriteToServer(sourceDataTable);
    23                     }
    24                     catch (Exception ex)
    25                     {
    26 
    27                         throw ex;
    28                     }
    29                 }
    30             }
    31         }

    调用:

     1     DataTable dt = new DataTable("测试");
     2             dt.Columns.Add("Id", typeof(int));
     3             dt.Columns.Add("Name", typeof(string));
     4             dt.Columns.Add("Age", typeof(int));
     5             for (int i = 1; i <= 10; i++)
     6             {
     7                 DataRow row = dt.NewRow();
     8                 row["Id"] = i;
     9                 row["Name"] = "名字" + i;
    10                 row["Age"] = i;
    11                 dt.Rows.Add(row);
    12             }
    13             Stopwatch stopWatch = new Stopwatch();
    14             stopWatch.Start();
    15 
    16         
    17 
    18             Console.WriteLine("批量插入table时间:"+stopWatch.Elapsed);

    批量插入List<T> :

     1    #region List<T> 批量插入
     2         /// <summary>
     3         /// 
     4         /// </summary>
     5         /// <typeparam name="T"></typeparam>
     6         /// <param name="data"></param>
     7         /// <param name="sqlconn"></param>
     8         public static void Sqlbulkcopy_<T>(List<T> data, string sqlconn = null)
     9         {
    10             #region 待处理数据初始化处理
    11             List<PropertyInfo> pList = new List<PropertyInfo>();//创建属性的集合
    12             DataTable dt = new DataTable();
    13             //把所有的public属性加入到集合 并添加DataTable的列    
    14             Array.ForEach<PropertyInfo>(typeof(T).GetProperties(), p =>
    15             {
    16                 pList.Add(p);
    17                 dt.Columns.Add(p.Name, p.PropertyType);
    18             });  //获得反射的入口(typeof()) //要对 array 的每个元素执行的 System.Action。
    19             foreach (var item in data)
    20             {
    21                 DataRow row = dt.NewRow(); //创建一个DataRow实例  
    22                 pList.ForEach(p => row[p.Name] = p.GetValue(item, null)); //给row 赋值
    23                 dt.Rows.Add(row); //加入到DataTable    
    24             }
    25             #endregion
    26             #region 批量插入数据库 SqlBulkCopy声明及参数设置
    27             SqlBulkCopy bulk = new SqlBulkCopy(sqlconn, SqlBulkCopyOptions.UseInternalTransaction)   //, SqlBulkCopyOptions.UseInternalTransaction
    28             {
    29                 DestinationTableName = "Tongbu" /*设置数据库目标表名称*/
    30                 ,
    31                 BatchSize = dt.Rows.Count /*每一批次中的行数*/
    32             };
    33 
    34             bulk.ColumnMappings.Add("Id", "Id"); //设置数据源中的列和目标表中的列之间的映射关系
    35                                                  // bulk.ColumnMappings.Add("FlightId", "FlightId");//ColumnMappings.Add("源数据表列名称", "目标表数据列名称");
    36             bulk.ColumnMappings.Add("Name", "Name");
    37             bulk.ColumnMappings.Add("Age", "Age");
    38 
    39 
    40             //...
    41             #endregion
    42             bulk.WriteToServer(dt);
    43             if (bulk != null)
    44             {
    45                 bulk.Close();
    46             }
    47         }
    48         #endregion

    调用: 

      List<TestModel> T_list = new List<TestModel>();
                for (int i = 1; i <= 100000; i++)
                {
                    T_list.Add(new TestModel() { Name = "Test" + i, Age = i });
                }
    
                Stopwatch stopWatch = new Stopwatch();
                stopWatch.Start();
    
               
                Sqlbulkcopy_Tran<TestModel>(T_list);
    
                Console.WriteLine(stopWatch.Elapsed);
  • 相关阅读:
    34组合总和(39)
    33 原子的数量(726)
    32 划分为k个相等的子集(698)
    31有效的井字游戏(794)
    30 设置交集大小至少为2
    28拼接最大数(321)
    js for循环闭包解决循环变量i遍历值
    js 绑定无响应 父元素监听,绑定子元素,事件绑定的几种方法以及区别
    如何让div+css兼容ie6 ie7 ie8 ie9和FireFox Chrome等浏览器
    css实现左侧固定宽,右侧自适应
  • 原文地址:https://www.cnblogs.com/super-xi-xi/p/10288671.html
Copyright © 2011-2022 走看看