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的更多相关文章

  1. EF结合SqlBulkCopy在项目中的使用

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

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

    原文链接:http://blog.csdn.net/fanbin168/article/details/51485969   批量插入 (17597条数据批量插入耗时1.7秒)   using Sys ...

  3. %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 ...

  4. EF批量添加数据性能慢的问题的解决方案

    //EF批量添加数据性能慢的问题的解决方案 public ActionResult BatchAdd() { using (var db = new ToneRoad.CEA.DbContext.Db ...

  5. EF 底层基础方法

    1 using System; 2 using System.Data; 3 using System.Collections.Generic; 4 using System.Data.Entity; ...

  6. EF中的那些批量操作

    在使用EF的过程中,我们经常会遇到需要批量操作数据的场景,批量操作有的时候不仅能提高性能,比如使用SqlBulkCopy进入批量插入的时候,而且比较方便操作,提高效率.那么这篇文章就来总结EF中的那些 ...

  7. .NET中的SqlBulkCopy类用法

    在开发过程中,经常会遇到向数据库插入大量数据的情况,那么如果是百万条数据,一条条的插入实在是太慢了,所以就有了SqlBulkCopy类. 本文中我将示范SqlBulkCopy类的不同应用. 以下面三张 ...

  8. 使用EF扩展EntityFramework.BulkInsert实现批量插入

    EntityFramework 最被人诟病的地方就是它的性能,处理大量数据时的效率.此种条件下,通常会转回使用 ADO.NET 来完成任务.而EntityFramework.BulkInsert则是利 ...

  9. EF操作扩展之async

    EF的操作类网上很多类,我只是把我在平时项目中的类进行一些改进和扩展,扩展了部分同步和异步的EF操作 接口 /// <summary> /// 接口数据操作基础类 /// </sum ...

随机推荐

  1. Spark第一个研究笔记1一片 - Spark一个简短的引论

    该公司推出的在线项目Spark拥有近1随着时间的推移.有效,Spark事实上,优秀的分布式计算平台,以提高生产力. 开始本篇笔记.此前的研究会Spark研究报告共享出来(由于篇幅的限制,它将被划分成制 ...

  2. 2014年度辛星完全解读html部分

    接下来,我们继续学习HTML标签,希望大家可以再接再厉.同一时候辛星也会支持大家.我们一起努力,一起加油. 我们本小节来认识另外几个标签. *************空格和换行************ ...

  3. MAC OSX 进程间通信

    Mac OS在下面IPC方式很多类型,大约如下. 1. Mach API  2. CFMessagePort  3. Distributed Objects (DO) NSDistributedNot ...

  4. 定义你自己ViewGroup

    尊重原创:http://blog.csdn.net/yuanzeyao/article/details/40264433 好久都没有写文章了,如今利用周末的时间对一些知识进行总结.便于加深理解,今天我 ...

  5. ecshop广告调用方法

    在简单地概括ecshop广告调用该方法,已发表在博客上,在这里,我们总结了以下 :就是官方默认的方法.先加入广告位,然后加入模板的广告位区域,再在将两者相应上. 1.后台 > 广告管理 > ...

  6. yii组态 redis主从配置(随着代码)

    最近的欲望redis 主从,但yii内建的redis 它不支持主从.不仅写了一个好办法 结构例,以下: 1.main.php通过添加下面的句子: //redis缓存配置 'cache_redis' = ...

  7. B/S在北大青鸟-ASP.NET 总结

    一个.前言: 这几周跟着于海涛老师进入了.NET编程世界.领略到了ASP.NET的精髓. 要说起ASP.NET的发展史,那要追溯到HTML了,由于它功能简单,无法从用户接收信息并自己主动进行更新.而不 ...

  8. hibernate Java 时间和日期类型 Hibernate 制图

    基础知识: 于 Java 于, 型表示的时间和日期包含: java.util.Date 和 java.util.Calendar. 外, 在 JDBC API 中还提供了 3 个扩展了 java.ut ...

  9. 汉高澳大利亚sinox2014电影播放flash最好的办法是安装游戏windows文本firefox

    事实上,韩澳sinox本身是没有原生flashplayer,无论怎么捣鼓,它们是从adobe弄linux要么windows版本号flashplayer,它不停地拨弄linux版本号flashplaye ...

  10. 半平面交总结and模板

    博客原文地址:http://blog.csdn.net/xuechelingxiao/article/details/40859973 这两天刷了POJ上几道半平面交,对半平面交有了初步的体会,感觉半 ...