繁体   English   中英

如何加快我从 excel 文件到 MVC C# 数据库中的 sql 数据库的导入速度

How to speed up my import from excel file to sql database in MVC C#

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在使用实体框架和 mvc c# 将 excel 文件中的数据提取到 sql 表中,问题是我正在循环大约七万条记录,所以我想知道如何加快处理速度。 我认为我的 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 个回复

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

这两行看起来没有必要:

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

您基本上是将整个文件读入 memory,但稍后使用InputStream进行 Excel 读取。

相反,使用输入 stream 将 1000 行读入对象,然后通过单个SaveChanges()调用将这些行添加到 DbContext 的已处置(/w using块)实例中。 您需要处理异常,因为如果任何 1 行失败,则不会保留该 1000 块。

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

1 C#将Excel文件导入Excel数据库错误

我遇到了错误:多步OLE DB操作生成错误。 检查每个OLE DB状态值(如果有)。 没有工作。 我正在使用SQL Server 2005和Visual Studio 2005。 在将excel文件导入到sql表中的表的过程中,我遇到了此错误。 下面是我的代码: 是因为我的 ...

2 如何使用C#和MVC 2从SQL数据库生成PDF / Excel文件?

我需要通过允许用户将其作为PDF或Excel电子表格下载来使数据库中的信息可用(两者都有效,两者都很完美)。 我已经看了很多选项,但我真的无法决定应该使用哪一个,更不用说这些选项中的任何一个实际上是有用的了。 我发现的大多数选项都是围绕将现有的HTML文件转换为PDF而不是我需要的。 ...

3 SQL 数据库从 Excel 导入到 MVC 站点

我有一个 excel 电子表格,我需要将其转换为 ASP.NET MVC 网站的 SQL 数据库。 电子表格的一个例子是: 我也有每一行的 ID(未显示)。 电子表格上的数字是包含所列项目(以 .htm 结尾的行)的项目。 我的数据库想法如下: 我在 MVC 网站上的最终目标是通过这 ...

4 是否可以使用C#或SQL轻松导入我将XSD导入SQL数据库的XML文件?

我尝试了一些东西,首先我使用xsd.exe生成了类,然后编写了一行快速的3行代码,将xml导入到C#的内存中。 然而,XML非常复杂,并且有相当多的不同类型。 然后我使用xsd2db创建一个与.xsd定义匹配的数据库。 我正在寻找一种简单的方法来将XML引入数据库,使用实体框架或类 ...

5 使用C#将Excel导入SQL数据库时出现异常

我在下面的链接中问过这个问题。 使用我面临的新错误消息重新发布: 使用Oledbconnection使用C#导入Excel时出现异常 我正在尝试构建“从excel导入到数据库”功能。 我使用下面的连接字符串在本地工作正常 部署后,出现错误 : System.Inval ...

2013-11-19 13:33:36 2 374   c#/ excel
6 在C#中将数据从Excel导入数据库

我需要使用编码指令将数据从Excel导入数据库。 但它给了我一个错误。 “位置0没有排。” 在第11行。 在此期间,我应该替换我的表名而不是第8行中的“TABLE”吗? 以下是我的代码: ...

7 C# 将 Excel 数据导入现有的 MDB 数据库

我有一个 Access MDB 文件,其中只有一个表,简称为“Sheet1”。 在 Sheet1 中,我已经有了 Fields Identified,但我将表中的任何记录留空。 我正在尝试将数据从 CSV 文件复制到 Access Sheet1 表中。 如果表尚不存在,下面的代码有效,但我在Ac ...

8 如何从我的SQL数据库和MVC(C#)创建饼图

我对C#比较C# 。 我正在尝试使用已经建立的本地数据库生成饼图,并且当前正在使用C# MVC 。 我搜索了一些示例,但没有找到一个清晰的示例。 当前,我的问题是无法识别“ Database.open”语句,将不胜感激您可以提供的任何链接或帮助。 ...

9 Excel使用C#导入数据库

嗨,请找到所附的屏幕截图,并向我提供如何实现此目标的逻辑。 我需要导入此excel文件。 这是一个示例图像。 我没有。 标头行的编号 每个标题中的列数会有所不同。 这是有关excel文件的另一信息。 Col单元格设置有背景色。 有没有办法从具有背景颜色的单元格中读取值 ...

10 通过Apache POI读取并通过Hibernate和JPA持久化,加快从excel文件导入数据库的速度

我正在尝试通过Apache POI读入并通过HBONET和JPA(这是使用JYA数据源的特定要求)在JBOSS 7.1中进行持久化来加快从Excel文件中数据库导入的速度。 但是,目前导入速度太慢-对于30,000条记录,大约需要3分钟,我需要将其减少到大约30秒。 我正在寻找帮助来设置批量 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM