此文主要用做记录用:

原因:数据库迁移,需要转换大量用户资料,两数据某字段加密方式不一致需要批量转换

注:转换程序用了EntityFramework

过程:

1.读取所有需要转换数据至List

2.采用Parallel.ForEach对List进行批次数据转换

3.将转换后的List数据按一定数量进行分割为List<List<T>>

4.建立List<List<T>>相应数量Task数组

5.采用Task.Run建立写入数据库Action

5.运行所有Task[],指令为Task.WaitAll(tasks);

总结:主要是针对写入数据库进行多线程方式处理,读取目前还能忍受,当时用foreach一笔笔写入程序直接假死,半天没反应,后采用多线程写入,效果非常明显

附代码如下:

List<TableName> query;
Stopwatch watch = new Stopwatch();
watch.Start();
using (DataBaseConext db = new DataBaseConext())
{
db.Configuration.ValidateOnSaveEnabled = false;
query = db.apuser.Where(p => p.unpwd != "").ToList();
}
watch.Stop();
MessageBox.Show(String.Format("读取使用秒数:{0}", watch.Elapsed.TotalSeconds)); watch.Restart();
Parallel.ForEach<TableName>(query, p =>
{
//SomethingCode
}); watch.Stop();
MessageBox.Show(String.Format("轉換使用秒數:{0}", watch.Elapsed.TotalSeconds)); watch.Restart();
List<List<TableName>> users = new List<List<TableName>>();
int splitCount = ;
while (query.Any())
{
users.Add(query.Take(splitCount).ToList());
query = query.Skip(splitCount).ToList();
} Task[] tasks = new Task[users.Count()];
for (int ctr = ; ctr < users.Count(); ctr++)
{
var s = users[ctr];
tasks[ctr] = Task.Run(() =>
{
using (DataBaseConext db = new DataBaseConext())
{
db.Configuration.ValidateOnSaveEnabled = false;
db.Configuration.AutoDetectChangesEnabled = false;
s.ForEach(p =>
{
db.Entry<TableName>(p).State = System.Data.Entity.EntityState.Modified;
db.SaveChanges(); Debug.WriteLine(String.Format("當前線程編號:{0}", Thread.CurrentThread.ManagedThreadId));
});
}
});
}
Task.WaitAll(tasks);
watch.Stop();
MessageBox.Show(String.Format("分割及保存使用秒數:{0}", watch.Elapsed.TotalSeconds)); MessageBox.Show("完成");

EntityFramework更新多条数据【8万】的更多相关文章

  1. mysql根据查询结果批量更新多条数据(插入或更新)

    mysql根据查询结果批量更新多条数据(插入或更新) 1.1 前言 mysql根据查询结果执行批量更新或插入时经常会遇到1093的错误问题.基本上批量插入或新增都会涉及到子查询,mysql是建议不要对 ...

  2. Android数据库更新——上万条数据的插入

    在实际情况下,很可能遇到会向一个表中插入10万条数据,而这样的数据库更新,如果用寻常的方式,在SQLiteOpenHelper.onUpdate()方法中不断的执行SQL语句,那么效率是可想而知的,甚 ...

  3. 在UPDATE中更新TOP条数据以及UPDATE更新中使用ORDER BY

    正常查询语句中TOP的运用: SELECT TOP 1000 * FROM MP_MemberGrade   随意更新一张表中满足条件的前N条数据: UPDATE TOP (1) MP_Member ...

  4. knockout更新列表中的某条数据,knockout.js绑定数组时更新其中一条数据

    knockout是一款前端实现MVVM的JS框架,仅knockout.js一个47kb的文件,相当实用,做前端无刷新页面,快速实现JS与HTML数据交互. knockout目前最新版:knockout ...

  5. Sql 随机更新一条数据返回更新数据的ID编号

    DECLARE @parimaryTable(临时表)  Table(prizecode varchar(50)); update top (1)  数据表 set 字段a='数值' ,字段b=‘数值 ...

  6. pymongo一次更新多条数据

    db.collection.update(query, update, upsert, multi) pymongo使用示例 db.collection.update({}, {'$set' : {' ...

  7. mongoose+koa2 按照_id更新多条数据,删除数组中的字段,然后添加新的字段,$pull和$or结合使用

    await model.photo.update({ _id: { $in: photoIdsParam } }, { $pull: { customerIds: { code: custCode, ...

  8. 十几万条数据的表中,基于帝国cms 。自己亲身体验三种批量更新数据的方法,每一种的速度是什么样的

    需求是 上传Excel 读取里面的数据.根据Excel中某一个字段,与数据表中的一个字段的唯一性.然后把 Excel表中数据和数据库表中数据一次更改.本次测试一次更新31条数据. 本次测试基于帝国cm ...

  9. mysql语句:批量更新多条记录的不同值[转]

    mysql语句:批量更新多条记录的不同值 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 帮助 1 UPDATE mytable SET myfield = 'value' WHERE ...

随机推荐

  1. 深入了解nagios的各配置文件

    转自http://wolfword.blog.51cto.com/4892126/1220209   对每个配置文件进行讲解,深入理解nagios,好好学习,天天向上~ (1)templates.cf ...

  2. linux grep命令总结

    风生水起善战者,求之于势,不责于人,故能择人而任势. 博客园    首页    新随笔    联系    订阅    管理 posts - 791,  comments - 394,  trackba ...

  3. mybatis的知识点总结

    1.接口绑定:两种方法,基于注解或者基于xml文档mapper,但要注意mapper的namespace要与接口路径完全一致. 2.orm格式转换:通过设置resultMap和ResultType,将 ...

  4. Django QuerySet API文档

    在查询时发生了什么(When QuerySets are evaluated) QuerySet 可以被构造,过滤,切片,做为参数传递,这些行为都不会对数据库进行操作.只要你查询的时候才真正的操作数据 ...

  5. SSH 远程连接

    ssh远程连接 准备工作: 1 准备两台linux pc 我们一般用的是VMware虚礼软件 2 这两台linux可以互通 3 linux1 :192.168.2.2 这台为你要连接的服务器 linu ...

  6. ORACLE【1】:触发器详解

    转自:http://blog.csdn.net/indexman/article/details/8023740 ORACLE PL/SQL编程之八: 把触发器说透 本篇主要内容如下: 8.1 触发器 ...

  7. 解锁windowsphone设备遇到的错误:检查Miscrosoft账户凭据、请重新注册 0x80004005 解决方案

    本篇文章主要讲在解锁windowsphone设备时遇到的错误 Error1:登录windowsphone开发人员中心时出错,请检查您的miscrosoft账户凭据 Error2:注册您的手机时出现未知 ...

  8. 51nod水题记

    妈呀51nod已经刷不动了又开始跟bzoj一样总是得看题解了...那么发一下总结吧... 1051:最大子矩阵 #include<cstdio> #include<cstring&g ...

  9. bzoj2818gcd

    原理很简单 题解我就不自己写了…… 做这题的时候,懂得了一个非常重要的转化:求(x, y) = k, 1 <= x, y <= n的对数等于求(x, y) = 1, 1 <= x, ...

  10. 体验Azure的 Automation “自动化” 服务预览版

    一直想要实现对Azure上跑的虚机进行定期的自动备份.在网上搜了一下有关的解决方案,发现一个不错的帖子,是基于国外的Azure服务做的.基本原理就是利用Azure的Automation(自动化)服务来 ...