我正在使用实体框架和mvc c#将excel文件中的数据提取到sql表中,问题是我正在遍历约7万条记录,因此我想知道如何加快处理速度。 我认为我的for循环不够聪明,没有太多的代码行,这也许就是处理速度很慢的原因。 我相信有一种更聪明,更快捷的方法。 我在下面的每个循环中粘贴了我的

 public ActionResult Upload(FormCollection formCollection)
            {
                var usersList = new List<marketingdbclients_tempDataTable>();
                if (Request != null)
                {
                    HttpPostedFileBase file = Request.Files["UploadedFile"];
                    if ((file != null) && (file.ContentLength > 0) && !string.IsNullOrEmpty(file.FileName))
                    {
                        string fileName = file.FileName;
                        string fileContentType = file.ContentType;
                        byte[] fileBytes = new byte[file.ContentLength];
                        var data = file.InputStream.Read(fileBytes, 0, Convert.ToInt32(file.ContentLength));
                        using (var package = new ExcelPackage(file.InputStream))
                        {
                            var currentSheet = package.Workbook.Worksheets;
                            var workSheet = currentSheet.First();
                            var noOfCol = workSheet.Dimension.End.Column;
                            var noOfRow = workSheet.Dimension.End.Row;
                            for (int rowIterator = 2; rowIterator <= noOfRow; rowIterator++)
                            {
                                var user = new marketingdbclients_tempDataTable();
                                user.FirstName = ConvertToString(workSheet.Cells[rowIterator, 2].Value);
                                user.MiddleName = ConvertToString(workSheet.Cells[rowIterator, 3].Value);
                                user.LastName = ConvertToString(workSheet.Cells[rowIterator, 4].Value);
                                //user.
                                user.RaceId = ConvertToString(workSheet.Cells[rowIterator, 6].Value);
                                user.DateOfBirth = ConvertToString(workSheet.Cells[rowIterator, 7].Value);
                                user.Age = ConvertToString(workSheet.Cells[rowIterator, 8].Value);
                                user.TitleTypeId = ConvertToString(workSheet.Cells[rowIterator, 9].Value);
                                user.Nationality = ConvertToString(workSheet.Cells[rowIterator, 10].Value);
                                user.PhysicalCountry = ConvertToString(workSheet.Cells[rowIterator, 11].Value);
                                user.PhysicalProvince = ConvertToString(workSheet.Cells[rowIterator, 12].Value);
                                user.PhysicalCity = ConvertToString(workSheet.Cells[rowIterator, 13].Value);
                                user.Area = ConvertToString(workSheet.Cells[rowIterator, 14].Value);
                                user.HighestQualification = ConvertToString(workSheet.Cells[rowIterator, 15].Value);
                                user.CurrentQualification = ConvertToString(workSheet.Cells[rowIterator, 16].Value);
                                user.PhysicalAddress = ConvertToString(workSheet.Cells[rowIterator, 17].Value);
                                user.Cell1 = ConvertToString(workSheet.Cells[rowIterator, 18].Value);
                                user.Cell2 = ConvertToString(workSheet.Cells[rowIterator, 19].Value);
                                user.Cell3 = ConvertToString(workSheet.Cells[rowIterator, 20].Value);
                                user.Cell4 = ConvertToString(workSheet.Cells[rowIterator, 21].Value);
                                user.Work1 = ConvertToString(workSheet.Cells[rowIterator, 22].Value);
                                user.Work2 = ConvertToString(workSheet.Cells[rowIterator, 23].Value);
                                user.Work3 = ConvertToString(workSheet.Cells[rowIterator, 24].Value);
                                user.Work4 = ConvertToString(workSheet.Cells[rowIterator, 25].Value);
                                user.Home1 = ConvertToString(workSheet.Cells[rowIterator, 26].Value);
                                user.Home2 = ConvertToString(workSheet.Cells[rowIterator, 27].Value);
                                user.Home3 = ConvertToString(workSheet.Cells[rowIterator, 28].Value); ;
                                user.Home4 = ConvertToString(workSheet.Cells[rowIterator, 29].Value);
                                user.LSMGroup = ConvertToString(workSheet.Cells[rowIterator, 30].Value);
                                user.Municipality = ConvertToString(workSheet.Cells[rowIterator, 31].Value);
                                user.Crediting_Rating = ConvertToString(workSheet.Cells[rowIterator, 32].Value);
                                user.Email1 = ConvertToString(workSheet.Cells[rowIterator, 33].Value);
                                user.Email2 = ConvertToString(workSheet.Cells[rowIterator, 34].Value);
                                user.Email3 = ConvertToString(workSheet.Cells[rowIterator, 35].Value);
                                user.Email4 = ConvertToString(workSheet.Cells[rowIterator, 36].Value);
                                user.Income = ConvertToString(workSheet.Cells[rowIterator, 35].Value);
                                user.Company = ConvertToString(workSheet.Cells[rowIterator, 36].Value);
                                user.Industry = ConvertToString(workSheet.Cells[rowIterator, 37].Value);
                                user.JobTitle = ConvertToString(workSheet.Cells[rowIterator, 38].Value);
                                user.LeadStage = ConvertToString(workSheet.Cells[rowIterator, 39].Value);
                                user.ReggieNumber = ConvertToString(workSheet.Cells[rowIterator, 40].Value);
                                user.Source = ConvertToString(workSheet.Cells[rowIterator, 41].Value);
                                //user.SNo = Convert.ToInt32(workSheet.Cells[rowIterator, 1].Value);
                                //user.Name = workSheet.Cells[rowIterator, 2].Value.ToString();
                                //user.Age = Convert.ToInt32(workSheet.Cells[rowIterator, 3].Value);
                                usersList.Add(user);
                            }
                        }
                    }
                }
                //MarketingDBEntitiesModel db = new MarketingDBEntitiesModel();
                using (MarketingDBEntitiesModel excelImportDBEntities = new MarketingDBEntitiesModel())
                {
                    foreach (var item in usersList)
                    {
                        excelImportDBEntities.marketingdbclients_tempDataTable.Add(item);
                    }
                    excelImportDBEntities.SaveChanges();
                }
                return View("Index");
            }
public string ConvertToString(object value)
        {
            try
            {
                return value.ToString();
            }
            catch
            {
                return "Null";
            }
        }

#1楼 票数:0

这将越来越慢,因为DbContext将在保存每个实体时跟踪它们。 将其分解为从excel读取并通过DbContext插入的500-1000行的数据块,但准备处理异常。

这两行看起来没有必要:

byte[] fileBytes = new byte[file.ContentLength];
var data = file.InputStream.Read(fileBytes, 0, Convert.ToInt32(file.ContentLength));

您基本上是将整个文件读取到内存中,但是稍后使用InputStream读取Excel。

而是使用Input流将1000行读入对象,然后通过一次SaveChanges()调用将这些行添加到DbContext的已处置(/ w using块)实例中。 如果任何1行失败,您将需要处理该异常,否则该1000的块将不会保留。

对于这样的大型操作,我不会将文件作为Web请求的一部分进行处理,而是将文件持久保存在服务器上,在Processing Queue表中创建包含文件位置和挂起状态的记录,然后返回页面。 后台工作程序进程可以轮询“处理队列”,拾取文件并在后台对其进行完全处理,从而更新记录的状态。 您的Web UI可以轮询队列记录,以报告队列是否已开始处理并按照您认为合适的方式跟踪进度。 像这样以内联方式处理请求的主要问题是,这将需要大量的CPU和内存,并且没有什么可以阻止多个用户启动此操作。 使用队列,即使您收到100个请求,它们的处理速度也仅与队列工作程序一样快(或在工作程序之间进行协调),这将限制对可用资源的影响。

  ask by Shumba Soft translate from so

未解决问题?本站智能推荐:

2回复

在MVC5 / EF应用程序中实现动态LINQ查询?

作为概述,我尝试向我的应用程序添加Export()功能-允许用户指定某些模型字段,并且仅通过使用LINQ查询并使用EPPlus库进行导出来导出这些字段中的值。 我试图基于此示例在我的MVC5 / EF Code-First应用程序中实现Dynamic LINQ功能,但似乎缺少一些东西来使其正常
1回复

使用实体框架(通过MVC)将上传的文档存储在数据库中

有没有人有使用实体框架在SQL Server 2008 DB中存储上载文档(Word或PDF 等 )的示例? 我想我已经了解了文件上传部分(请参见下面的代码),尽管我愿意接受建设性的意见。 我以前在较旧的数据库中做过很多文档存储,并且由于SQL Server 2008具有新的数据类型
2回复

用剃刀将图像保存在sql数据库中(ASP .net MVC,Entity Framework)

我有一个Web应用程序,我想在其中将图像保存在数据库中。 在我的Application.Web中,我有一个名为images的文件夹。 上传的图像应保存在此处。 我想将图像以\\ images \\ user1.jpg之类的格式保存在数据库中。 从控制器生成的My Create.csh
1回复

无法使用外键将多个文件保存到数据库

在我的MVC应用程序中,我有两个表,分别称为票证和附件 ,我想为每个票证保存附件。 问题是: 创建新票证时 ,我需要使用TicketID保存多个附件。 因此,我认为我应该在“票证”表中创建一个新票证,然后获取其ID并将所有带有此票证ID的附件循环保存到“附件”表中。 我看过很多网站和sta
1回复

System.Web.HttpPostedFileWrapper 在 MVC C# 中将图像上传到数据库时出错

我这里有问题。 当我从我的 BeginForm 中删除("Create", "DriverRegs", FormMethod.Post, new { enctype = "multipart/form-data" }) ,图像路径通常存储在数据库中,但是当我把它放回上面时到 BeginForm,然后
1回复

如何在实体中更新而不更新文件上传字段

我想寻求帮助,你看我有一个更新方法,当图像上传输入为空时不起作用。 这不应该是这种情况,因为不是字段一直在更新。 我在后端使用实体框架。 这是控制器的代码 正如您在评论部分中看到的那样,我尝试使用“IsModified”属性来阻止图像上传,但可惜它不起作用。 我也尝试检查图像是否为空,但它也
1回复

MVC 5编辑操作保存输入错误

当我编辑“销售员”时,我试图根据用户输入保存新的文件路径或旧的文件路径,它应该覆盖图像,或者将使用存储在数据库中的先前图像。 但是,当我尝试修改实体状态时,在将更改保存到SQL Server中之前,出现了以下错误: EntityFramework.dll中发生类型'System.
1回复

如果没有重新上传图像,则不要保存空图像数据 Asp.net mvc

我一直在关注 Apress Pro ASP.NET MVC 3 Framework 书中的 SportsStore 示例项目,并尝试将这些概念应用于我的应用程序。 困扰我的一个方面是,在示例中,我可以向产品添加图像并将其保存到数据库中,但是如果我编辑任何给定的产品,而没有为其上传新图像,图像数据将被