这是我第一次写博客,由于水平有限,写不出什么好东西,还望见谅。

我现在参与的这个项目采用的是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结合SqlBulkCopy在项目中的使用 这是我第一次写博客,由于水平有限,写不出什么好东西,还望见谅. 我现在参与的这个项目采用的是EF框架,方便了数据库的访问.但在实际中,发现项目中导入市县E ...

  2. EF项目中应用出现问题???

    最近用EF做了个项目发现很多不便利的地方. 具体如下. 1,我是通过edmx 建模,然后通过模型生成数据库. 虽然数据库已经创建成功但是问题来了,我在加字段,和标的时候再次生成时domeo.edmx. ...

  3. [翻译 EF Core in Action 1.10] 应该在项目中使用EF Core吗?

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

  4. 项目中如何使用EF

    本文将在技术层面挑战园子里的权威大牛们,言语不敬之处敬请包涵.本文旨为技术交流,欢迎拍砖. 园子里面分享和推荐Entity Framework(以下简称EF)的Repository(仓储)设计模式的文 ...

  5. visual studio 项目中使用EF创建的数据库,后续更新数据库操作(生产已经部署,不能删除数据库重新创建)

    情景:SharePoint项目(其他类型的项目道理也一样),数据库是用EF(版本:6.0.0.0)创建的,生产环境已经使用,所以后续修改数据库,只能通过更新来实现. 下面是具体的操作方式: 1.vis ...

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

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

  7. 2_MVC+EF+Autofac(dbfirst)轻型项目框架_用户权限验证

    前言 接上面两篇 0_MVC+EF+Autofac(dbfirst)轻型项目框架_基本框架 与 1_MVC+EF+Autofac(dbfirst)轻型项目框架_core层(以登陆为例) .在第一篇中介 ...

  8. 1_MVC+EF+Autofac(dbfirst)轻型项目框架_core层(以登陆为例)

    前言 在上一篇0_MVC+EF+Autofac(dbfirst)轻型项目框架_基本框架中,我已经介绍了这个轻型框架的层次结构,在下面的这篇文章中,我将以教师登陆功能为例,具体来扩充下我的core层的代 ...

  9. 0_MVC+EF+Autofac(dbfirst)轻型项目框架_基本框架

    前言 原来一直使用他人的开源项目框架,异常的定位会很麻烦,甚至不知道这个异常来自我的代码还是这个框架本身.他人的框架有一定的制约性,也有可能是我对那些框架并没深入了解,因为这些开源框架在网上也很难找到 ...

随机推荐

  1. BZOJ 3672 购票

    Description 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国\(n\)个城市的OIer们都会从各地出发,到SZ市参加这次盛会. 全国的城市构成了一棵以SZ市为根的有根树,每个城市与 ...

  2. HTTP之Content-Length

    在HTTP协议中,有Content-Length的详细解读.Content-Length用于描述HTTP消息实体的传输长度the transfer-length of the message-body ...

  3. Duplex Services (Msdn)

    Duplex Services from msdn A duplex service contract is a message exchange pattern in which both endp ...

  4. 服务器RAID配置全程与RAID基础知识

    服务器RAID配置全程 一.RAID介绍 RAID是Redundent Array of Inexpensive Disks的缩写,直译为“廉价冗余磁盘阵列”,也简称为“磁盘阵列”.后来RAID中的字 ...

  5. mysql 学习(1)

    1.从图中看到mysql是客户服务器模式. 2.我们如何操纵数据库? a.直接sql,各种编程语言, 3.客户端和服务器如何通信呢? 凡是c/s模式的都会自己的协议,但是都是基于TCP/IP协议,在l ...

  6. HTML Meta, http-equiv, Refresh

    原文: http://www.lifelaf.com/blog/?p=481 在HTML页面中,如果想实现定时刷新或重定向,我们可以使用meta标签的refresh功能: <!-- 5秒后刷新页 ...

  7. 长沙Uber优步司机奖励政策(1月25日~1月31日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  8. win8.1 无法安装 net framework3.5的解决办法

    近期给重装系统时,发现Windows8.1无法安装.net framework 3.5,即使我离线下载了安装文件,还要求安装2.0和3.0....而且无法从Windows更新中获取,因此百度到以下方案 ...

  9. nginx安装lua-nginx-module模块

    转载注明地址:http://www.cnblogs.com/dongxiao-yang/p/5312285.html 本文主要采用手动源码安装的方式将lua-nginx模块编译到nginx源码内部 一 ...

  10. Java中的一些常见错误

    1.空指针错误 在java数组的使用中,有时候需要对字符串数组中的元素进行对比.那么当元素不为null时,程序会正常运行:然而,一旦对比的元素为null,那么程序就会出现空指针错误. 解决方法:加入保 ...