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. fragment 中利用spinner实现省市联动

    (1)布局文件就不在说明了,主要说代码的实现,先把代码贴上! package com.example.cl; import android.annotation.SuppressLint; impor ...

  2. sql推断时间

    SELECT * FROM msg_personchat_t WHERE send_userid='28' AND critime>'2014-03-30' AND critime<'20 ...

  3. css整理 background-size优化

    font-size:12px; line-height:22px; font-family:Arial,Helvetica,sans-serif; /*优化*/ font:12px/22px Aria ...

  4. HDU-4628 Pieces 如压力DP

    鉴于他的字符串,每一个都能够删除回文子串.子可以是不连续,因此,像更好的模拟压力.求删除整个字符串需要的步骤的最小数量. 最大长度为16,因此不能逐行枚举状态.首先预处理出来全部的的回文子串,然后从第 ...

  5. “采用VS2010至MFC4.2发育”最后溶液

    我层2010年这方面的研究进行了简单(http://blog.csdn.net/boweirrking/article/details/5477062),那时候没有深入思考过这当中的原理,最终给出的方 ...

  6. axure & Markman

    axure & Markman学习总结 最近学了几款有意思的软件,一款是axure,另一款是Markman.接下来聊聊自己的学习心得吧. 关于axure,百度上的解释是:是一个专业的快速原型设 ...

  7. 使用PF_PACKET和SOCK_RAW发送自己定义type以太网数据包

    本文介绍使用PF_PACKET和SOCK_RAW发送自己定义type以太网数据包,使用wireshare抓包能够获取到数据包,为Linux内核添加网络协议做铺垫. 先上码: #include < ...

  8. POJ 1026 Cipher(更换)

                                                                   Cipher Time Limit: 1000MS   Memory Li ...

  9. Codeforces 383C . Propagating tree【树阵,dfs】

    标题效果: 有一棵树,有两种操作模式对本树:1:表示为(1 x val),在NOx加在节点上val,然后x每个节点加上儿子- val.给每个儿子一个儿子在一起-(- val),加到没有儿子为止.2:表 ...

  10. 彩色图像上执行Mean Shift迭代搜索目标 ,维加权直方图 + 巴氏系数 + Mean Shift迭代

    今天要给大家分享的是: 在彩色图像上进行Mean Shift迭代搜索目标 二维加权直方图+巴氏系数+Mean Shift迭代 关于 加权直方图.巴氏系数.Mean Shift迭代 这三者之间的关系请大 ...