EF结合SqlBulkCopy
EF结合SqlBulkCopy在项目中的使用
这是我第一次写博客,由于水平有限,写不出什么好东西,还望见谅。
我现在参与的这个项目采用的是EF框架,方便了数据库的访问。但在实际中,发现项目中导入市县Excel数据耗时太长,于是趁这段时间专门研究了一下大数据的导入。
Excel数据如图:

项目数据库里已经有了省市数据,任务是导入县数据。其中省市县之间有外键关系。项目里已经有了读取Excel表的方法,而且效率不低,耗时主要是在导入到Sql Server2008中
public void ImportCounties(List<County> counties)
{
List<City> cities = counties.Select(d => d.City).ToList();
MyTestEntities db = new MyTestEntities();
foreach (var city in cities)
{
Province province =
db.Provinces.Where(d => d.Name == city.Province.Name).First();
city.Province = province;
}
foreach (var county in counties)
{
db.Counties.AddObject(county);
}
db.SaveChanges();
}
这是项目里的源代码,耗时40秒左右。我测试之后发现不仅效率低,而且是有bug的。测试时第一次录入数据没问题,如果删除Counties表里的数据再导入数据是有问题的,我不知道为什么要为Province赋值而且第一次可以成功,如果有大神看见,请帮我解惑。我只能先尝试以我的方法去做。
public void ImportCountiesSecond(List<County> counties)
{
MyTestEntities db = new MyTestEntities();
List<City> cities = db.Cities.ToList();
foreach (var county in counties)
{
county.City = cities.Where(d => d.Name == county.City.Name).FirstOrDefault();
db.Counties.AddObject(county);
}
db.SaveChanges();
}
速度大概缩减到20秒,但这也不是我所能忍受的。于是上网又查了资料,了解到SqlBulkCopy。
代码如下:
public void ImportCountiesThird(List<County> counties)
{
MyTestEntities db = new MyTestEntities();
string conStr = ConfigurationManager.ConnectionStrings["dbConnStr"].ConnectionString;
List<City> cities = db.Cities.ToList();
DataTable table = new DataTable();
table.Columns.Add("CityId", typeof(int));
table.Columns.Add("Name");
table.Columns.Add("OrderNum", typeof(int));
table.Columns.Add("IsCity", typeof(bool));
for (int i = 0; i < counties.Count; i++)
{
County line = counties[i];
int cityId = cities.Where(d => d.Name == counties[i].City.Name).FirstOrDefault().CityId;
string name = line.Name;
int orderNum = line.OrderNum;
bool isCity = line.IsCity;
DataRow row = table.NewRow();
row["CityId"] = cityId;
row["Name"] = name;
row["OrderNum"] = orderNum;
row["IsCity"] = isCity;
table.Rows.Add(row);
}
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conStr))
{
bulkCopy.DestinationTableName = "Counties";
bulkCopy.ColumnMappings.Add("CityId", "CityId");
bulkCopy.ColumnMappings.Add("Name", "Name");
bulkCopy.ColumnMappings.Add("OrderNum", "OrderNum");
bulkCopy.ColumnMappings.Add("IsCity", "IsCity");
bulkCopy.WriteToServer(table);
}
}
时间缩减到4秒左右,其中主要是在EF查询City表并为每一个Counties赋值时耗时占了大半。但这个的优化我觉得暂时做不到了,先这样吧。
EF结合SqlBulkCopy的更多相关文章
- EF结合SqlBulkCopy在项目中的使用
这是我第一次写博客,由于水平有限,写不出什么好东西,还望见谅. 我现在参与的这个项目采用的是EF框架,方便了数据库的访问.但在实际中,发现项目中导入市县Excel数据耗时太长,于是趁这段时间专门研究了 ...
- EF结合SqlBulkCopy实现高效的批量数据插入 |EF插件EntityFramework.Extended实现批量更新和删除
原文链接:http://blog.csdn.net/fanbin168/article/details/51485969 批量插入 (17597条数据批量插入耗时1.7秒) using Sys ...
- %E3%80%90%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E3%80%91
"%3Cdiv%20class%3D%22htmledit_views%22%20id%3D%22content_views%22%3E%0A%20%20%20%20%20%20%20%20 ...
- EF批量添加数据性能慢的问题的解决方案
//EF批量添加数据性能慢的问题的解决方案 public ActionResult BatchAdd() { using (var db = new ToneRoad.CEA.DbContext.Db ...
- EF 底层基础方法
1 using System; 2 using System.Data; 3 using System.Collections.Generic; 4 using System.Data.Entity; ...
- EF中的那些批量操作
在使用EF的过程中,我们经常会遇到需要批量操作数据的场景,批量操作有的时候不仅能提高性能,比如使用SqlBulkCopy进入批量插入的时候,而且比较方便操作,提高效率.那么这篇文章就来总结EF中的那些 ...
- .NET中的SqlBulkCopy类用法
在开发过程中,经常会遇到向数据库插入大量数据的情况,那么如果是百万条数据,一条条的插入实在是太慢了,所以就有了SqlBulkCopy类. 本文中我将示范SqlBulkCopy类的不同应用. 以下面三张 ...
- 使用EF扩展EntityFramework.BulkInsert实现批量插入
EntityFramework 最被人诟病的地方就是它的性能,处理大量数据时的效率.此种条件下,通常会转回使用 ADO.NET 来完成任务.而EntityFramework.BulkInsert则是利 ...
- EF操作扩展之async
EF的操作类网上很多类,我只是把我在平时项目中的类进行一些改进和扩展,扩展了部分同步和异步的EF操作 接口 /// <summary> /// 接口数据操作基础类 /// </sum ...
随机推荐
- Socket编程实践(4) --更复杂的过程server
1.Socket地址复用 int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen); in ...
- fzu 2150 Fire Game 【身手BFS】
称号:fzupid=2150"> 2150 Fire Game :给出一个m*n的图,'#'表示草坪,' . '表示空地,然后能够选择在随意的两个草坪格子点火.火每 1 s会向周围四个 ...
- 怎么样CSDN Blog投机和增加流量?
所谓推测装置,以提高它们的可见性,最近比较顾得上,这样一来打字游戏.一方面,练习打字速度 .在又一个方面中,以了解诱导的理论 版权声明:本文博客原创文章,博客,未经同意,不得转载.
- libsvm工具箱C++编程实践2
转载请注明出处 http://blog.csdn.net/u013491262/article/details/37344193 点击打开链接 上周因为皮肤有点过敏,去医院来来回回一周. 前几天 ...
- php用空格代替标点符号
php作为常规赛的符号替换为空格 <? php $character = "!@#$%^&*于'纸'纸'文().,<>|[]'\":;}{-_+=? /a ...
- HTTP 长连接 使用场景
offer 80 非常多应用譬如监控.即时通信.即时报价系统都须要将后台发生的变化实时传送到client而无须client不停地刷新.发送请求. 在 多好科技的那位技术指导问我这个是由于他们做物连网, ...
- Linux命令行下载文件百度云盘
本来想直接使用wget去下载.但百度似乎增加限制,下半停产,不就不再下.刚刚好找其他方法.另辟蹊径: http://oott123.github.io/bpcs_uploader/ 版权声明:本文博客 ...
- jQuery表格排序总成-tablesorter
一个.进口单证 <script type="text/javascript" src="js/jquery.js"></script> ...
- PHP Yii框架开发——组织架构网站重构
最近一段时间在维护公司的组织架构网站(Org),旧版网站只是用了xampp简单搭建了一套环境部署在了windows机器上,代码结构相对简单. 整个架构如下: 整个架构没有用到复杂的结构,class里放 ...
- 贪心算法(Greedy Algorithm)最小生成树 克鲁斯卡尔算法(Kruskal's algorithm)
克鲁斯卡尔算法(Kruskal's algorithm)它既是古典最低的一个简单的了解生成树算法. 这充分反映了这一点贪心算法的精髓.该方法可以通常的图被表示.图选择这里借用Wikipedia在.非常 ...