原文链接:http://blog.csdn.net/fanbin168/article/details/51485969

 

批量插入 (17597条数据批量插入耗时1.7秒)

  1.  
    using System;
  2.  
    using System.Collections.Generic;
  3.  
    using System.Linq;
  4.  
    using System.Web;
  5.  
    using System.Web.Mvc;
  6.  
     
  7.  
    namespace MvcApplication1.Controllers
  8.  
    {
  9.  
    using MvcApplication1.Models;
  10.  
    using EntityFramework.Extensions;
  11.  
    using System.ComponentModel;
  12.  
    using System.Data;
  13.  
    using System.Data.SqlClient;
  14.  
    using System.Diagnostics;
  15.  
    public class HomeController : Controller
  16.  
    {
  17.  
    public ActionResult Index()
  18.  
    {
  19.  
    Stopwatch sw = new Stopwatch(); //计时器
  20.  
    sw.Start();//开始计时
  21.  
     
  22.  
    using (var db = new salesEntities())
  23.  
    {
  24.  
     
  25.  
    List<location> entitys = db.location.ToList(); //构建集合,到时候会将这个集合数据批量插入到
  26.  
     
  27.  
    if (db.Database.Connection.State != ConnectionState.Open)
  28.  
    {
  29.  
    db.Database.Connection.Open(); //打开Connection连接
  30.  
    }
  31.  
     
  32.  
    //调用BulkInsert方法,将entitys集合数据批量插入到数据库的tolocation表中
  33.  
    BulkInsert<location>((SqlConnection)db.Database.Connection, "tolocation", entitys);
  34.  
     
  35.  
    if (db.Database.Connection.State != ConnectionState.Closed)
  36.  
    {
  37.  
    db.Database.Connection.Close(); //关闭Connection连接
  38.  
    }
  39.  
    }
  40.  
     
  41.  
    sw.Stop(); //结束计时
  42.  
    string aa = sw.Elapsed.ToString();//批量插入了17597条数据。耗时1.7秒
  43.  
    return View();
  44.  
    }
  45.  
     
  46.  
     
  47.  
    /// <summary>
  48.  
    /// 批量插入
  49.  
    /// </summary>
  50.  
    /// <typeparam name="T">泛型集合的类型</typeparam>
  51.  
    /// <param name="conn">连接对象</param>
  52.  
    /// <param name="tableName">将泛型集合插入到本地数据库表的表名</param>
  53.  
    /// <param name="list">要插入大泛型集合</param>
  54.  
    public static void BulkInsert<T>(SqlConnection conn, string tableName, IList<T> list)
  55.  
    {
  56.  
    using (var bulkCopy = new SqlBulkCopy(conn))
  57.  
    {
  58.  
    bulkCopy.BatchSize = list.Count;
  59.  
    bulkCopy.DestinationTableName = tableName;
  60.  
     
  61.  
    var table = new DataTable();
  62.  
    var props = TypeDescriptor.GetProperties(typeof(T))
  63.  
     
  64.  
    .Cast<PropertyDescriptor>()
  65.  
    .Where(propertyInfo => propertyInfo.PropertyType.Namespace.Equals("System"))
  66.  
    .ToArray();
  67.  
     
  68.  
    foreach (var propertyInfo in props)
  69.  
    {
  70.  
    bulkCopy.ColumnMappings.Add(propertyInfo.Name, propertyInfo.Name);
  71.  
    table.Columns.Add(propertyInfo.Name, Nullable.GetUnderlyingType(propertyInfo.PropertyType) ?? propertyInfo.PropertyType);
  72.  
    }
  73.  
     
  74.  
    var values = new object[props.Length];
  75.  
    foreach (var item in list)
  76.  
    {
  77.  
    for (var i = 0; i < values.Length; i++)
  78.  
    {
  79.  
    values[i] = props[i].GetValue(item);
  80.  
    }
  81.  
     
  82.  
    table.Rows.Add(values);
  83.  
    }
  84.  
     
  85.  
    bulkCopy.WriteToServer(table);
  86.  
    }
  87.  
    }
  88.  
     
  89.  
    }
  90.  
    }

使用EF扩展EntityFramework.Extended 对数据进行批量更新,和批量删除

首先去nuget上下载EntityFramework.Extended插件(搜索:EntityFramework.Extended) 安装后,在项目中引入using EntityFramework.Extensions; 名称空间
 

批量更新(17597条数据,批量更新耗时1.69秒)

  1.  
    using System;
  2.  
    using System.Collections.Generic;
  3.  
    using System.Linq;
  4.  
    using System.Web;
  5.  
    using System.Web.Mvc;
  6.  
     
  7.  
    namespace MvcApplication1.Controllers
  8.  
    {
  9.  
    using MvcApplication1.Models;
  10.  
    using EntityFramework.Extensions; //使用EF的EntityFramework.Extended插件需要引入此名称空间
  11.  
    using System.Diagnostics;
  12.  
     
  13.  
    public class HomeController : Controller
  14.  
    {
  15.  
    public ActionResult Index()
  16.  
    {
  17.  
    salesEntities db = new salesEntities();
  18.  
     
  19.  
    Stopwatch sw = new Stopwatch(); //计时器
  20.  
    sw.Start();
  21.  
     
  22.  
    //调用插件的Update方法进行批量更新(不需要我们手动的db.SaveChanges()了)
  23.  
    //db.location.Update(r => new location { version = 123 });//批量将location表里version字段数据更新为123
  24.  
     
  25.  
    db.tolocation.Where(r => r.locId < 100).Update(c => new tolocation { version = 236 }); //也可以带条件批量修改
  26.  
     
  27.  
     
  28.  
    sw.Stop();
  29.  
    string aa = sw.Elapsed.ToString();//批量更新了17597条数据。耗时1.69秒
  30.  
    return View();
  31.  
    }
  32.  
    }
  33.  
    }

批量删除(17597条数据,批量删除耗时1.76秒)

    1.  
      using System;
    2.  
      using System.Collections.Generic;
    3.  
      using System.Linq;
    4.  
      using System.Web;
    5.  
      using System.Web.Mvc;
    6.  
       
    7.  
      namespace MvcApplication1.Controllers
    8.  
      {
    9.  
      using MvcApplication1.Models;
    10.  
      using EntityFramework.Extensions; //使用EF的EntityFramework.Extended插件需要引入此名称空间
    11.  
      using System.Diagnostics;
    12.  
       
    13.  
      public class HomeController : Controller
    14.  
      {
    15.  
      public ActionResult Index()
    16.  
      {
    17.  
      salesEntities db = new salesEntities();
    18.  
       
    19.  
      Stopwatch sw = new Stopwatch(); //计时器
    20.  
      sw.Start();
    21.  
       
    22.  
      //调用插件的Delete方法进行批量删除(不需要我们手动的db.SaveChanges()了)
    23.  
      //db.location.Delete(r => r.locId < 100000);
    24.  
       
    25.  
      db.location.Where(r => r.locId < 10000).Delete(); //当然我也可以这样写
    26.  
       
    27.  
       
    28.  
      sw.Stop();
    29.  
      string aa = sw.Elapsed.ToString();//批量删除了17597条数据。耗时1.76秒
    30.  
      return View();
    31.  
      }
    32.  
      }
    33.  
      }

EF结合SqlBulkCopy实现高效的批量数据插入 |EF插件EntityFramework.Extended实现批量更新和删除的更多相关文章

  1. yii批量数据插入

    yii框架批量插入数据有两种方法,第一种是循环多次插入和一次批量插入,第一种方法要注意插入数据中间有一次数据插入失败要注意回滚事务 循环插入数据 第一种方法 $model = new User(); ...

  2. MyBatis Plus 批量数据插入功能,yyds!

    最近 Review 小伙伴代码的时候,发现了一个小小的问题,小伙伴竟然在 for 循环中进行了 insert (插入)数据库的操作,这就会导致每次循环时都会进行连接.插入.断开连接的操作,从而导致一定 ...

  3. ef和mysql使用(二)--让mysql支持EntityFramework.Extended实现批量更新和删除

    我们都知道Entity Framework 中不能同时更新多条记录,但是一个老外写的扩展库可以实现此功能EntityFramework.Extended,但是如何是mysql数据库要怎么实现呢 首先实 ...

  4. 使用SqlBulkCopy进行批量数据插入

    Dim dt As DataTable = New DataTable() dt.Columns.Add("DtCostProductRuleGUID", GetType(Guid ...

  5. 原创 SqlParameter 事务 批量数据插入

    不错,很好,以后防注入批量事务提交虽然麻烦点研究了几个小时,但不会是问题了 SqlCommand cmd; HelpSqlServer helps = new HelpSqlServer(); //定 ...

  6. [oracle/java/sql]用于上十万批量数据插入Oracle表的Java程序

    程序下载:https://files.cnblogs.com/files/xiandedanteng/LeftInnerNotExist20191222.rar 原理:Oracle的Insert al ...

  7. KingbaseES批量数据加载的实践技巧

    有时,KingbaseES数据库需要在单个或最少的步骤中导入大量数据,这通常称为批量数据导入.其中数据源通常是一个或多个大文件,这个过程有时可能非常慢. 造成性能不佳的原因有很多:索引.触发器.外键. ...

  8. EntityFramework 插件之EntityFramework.Extended (批量处理)

    接手了一个用EF来做的项目,由于项目中使用的原生处理,导致很多update都是采用先select 后 update的方式来实现,同时无法批量执行逻辑如:根据订单类型统一更新状态等.所以在经过了N多查找 ...

  9. 15.更新和删除数据--SQL

    一.更新数据 更新(修改)表中的数据,可以使用UPDA TE语句.有两种使用UPDA TE的方式: 更新表中的特定行: 更新表中的所有行. 警告:不要省略WHERE子句 在使用UPDA TE时一定要细 ...

随机推荐

  1. swiper动态改变滑动内容

    假设当前显示的是1,往左滑动一个递减1,往右滑动一个递增1 body下面添加如下代码 <div class="swiper-container temp"> <d ...

  2. GIS 地理坐标分类

    wgs84 GPS系统直接通过卫星定位获得的坐标.(最基础的坐标.) gcj02 兲朝已安全原因为由,要求在中国使用的地图产品使用的都必须是加密后的坐标.这套加密后的坐标就是gcj02 google的 ...

  3. How to fix Mysql table crashes

    Whenever you enconter this: Please use mysql_upgrade to fix this error. or using  mysql_upgrade -u r ...

  4. linux命令大全比较完整

    转:https://www.cnblogs.com/yjd_hycf_space/p/7730690.html 最近都在和Linux打交道,感觉还不错.我觉得Linux相比windows比较麻烦的就是 ...

  5. XSS防范之Encode(转)

    防范XSS有三道防火墙:数据的输入校验,数据输出Encode,浏览器安全(主要就是CSP),这里主要介绍Encode. #用于XSS防范的Encode 用户防范XSS的Encode主要有三种:Html ...

  6. 【Oracle】Update方法

    1.单表更新 update customers set city_name='山西省太原市' where city_name='山西太原' 2.两表(多表)关联update -- 被修改值由另一个表运 ...

  7. Django 代码初体验

    其实Django中的代码逻辑就是和我们以前所学的一些项目差不多 就是 解耦.解耦.解耦 创建过后的Django文件 其中的day68是你的 项目的名字的相同的一个自动生成的文件里面都是放置配置文件类似 ...

  8. DB2问题记录本

    1.System.Data.OleDb.OleDbException (0x80004005): 未指定的错误. 场景:部署网站到IIS上,使用oledb连接DB2数据库报错,开发环境正常 解决方案: ...

  9. 企业级Apache详解

    安装Apache #Apache安装 rpm -qa|grep httpd yum install httpd #2编译安装: -->推荐安装 cd /root/software yum -y ...

  10. scala简介

    1.什么是Scala scala官方网址: http://www.scala-lang.org Scala是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特性.Scala运行 ...