从Excel导入MVC3应用程序的最快方法

时间:2012-06-14 13:54:22

标签: c# sql-server asp.net-mvc-3 entity-framework

我正在从CSV文件导入到我的ASP.NET MVC3 / C#/ Entity Framework应用程序。

目前这是我的代码,但我希望优化:

var excel = new ExcelQueryFactory(file);
var data = from c in excel.Worksheet(0)
            select c;
var dataList = data.ToList();

List<FullImportExcel> importList = new List<FullImportExcel>();
foreach (var s in dataList.ToArray())
{
    if ((s[0].ToString().Trim().Length < 6) && (s[1].ToString().Trim().Length < 7))
    {
        FullImportExcel item = new FullImportExcel();
        item.Carrier = s[0].ToString().Trim();
        item.FlightNo = s[1].ToString().Trim();
        item.CodeFlag = s[2].ToString().Trim();

        //etc etc (50 more columns here)

        importList.Add(item);
    }
}

PlannerEntities context = null;
context = new PlannerEntities();
context.Configuration.AutoDetectChangesEnabled = false;
int count = 0;

foreach (var item in importList)
{
    ++count;
    context = AddToFullImportContext(context, item, count, 100, true);
}

private PlannerEntities AddToFullImportContext(PlannerEntities context, FullImportExcel entity, int count, int commitCount, bool recreateContext)
{
      context.Set<FullImportExcel>().Add(entity);

      if (count % commitCount == 0)
      {
          context.SaveChanges();
          if (recreateContext)
          {
              context.Dispose();
              context = new PlannerEntities();
              context.Configuration.AutoDetectChangesEnabled = false;
          }
      }
      return context;
}

这样可以正常工作,但速度不是很快,而且我需要做的导入每月最少200万行。有没有更好的方法进行批量进口? 我最好完全避免使用EF并使用SQLConnection并插入那种方式吗?

由于

3 个答案:

答案 0 :(得分:3)

我确实知道你是如何在每X个记录中提交记录的(在你的情况下是100个。)

我最近写了一个系统,每月一次,需要一次更新超过50,000条记录的状态 - 这是更新每条记录并为每条更新记录插入审核记录。

最初我用实体框架写了这个,并且花了5-6分钟来完成这部分任务。 SQL事件探查器向我展示它正在进行100,000次SQL查询 - 每个记录一次UPDATE和一次INSERT(我猜想如预期的那样)。

我将其更改为存储过程,该存储过程以逗号分隔的记录ID列表,状态和用户ID作为参数,执行批量更新,然后进行批量插入。现在需要5秒钟。

在您的情况下,对于此数量的记录,我建议创建一个BULK IMPORT文件并将其传递给SQL以进行导入。

http://msdn.microsoft.com/en-us/library/ms188365.aspx

答案 1 :(得分:2)

对于SQL Server中的大量插入,批量复制是最快的方法。您可以使用SqlBulkCopy类从代码访问批量复制。您必须为列表创建IDataReader,或者您可以使用this IDataReader插入我编写的通用列表。

答案 2 :(得分:0)

感谢Andy的提升 - 这是SQL中使用的代码,有一点帮助,Pinal Dave - http://blog.sqlauthority.com/2008/02/06/sql-server-import-csv-file-into-sql-server-using-bulk-insert-load-comma-delimited-file-into-sql-server/:)

DECLARE @bulkinsert NVARCHAR(2000)
DECLARE @filepath NVARCHAR(100)
set @filepath = 'C:\Users\Admin\Desktop\FullImport.csv'
SET @bulkinsert = 
    N'BULK INSERT FullImportExcel2s FROM ''' + 
    @filepath + 
    N''' WITH (FIRSTROW = 2, FIELDTERMINATOR = '','', ROWTERMINATOR = ''\n'')'

EXEC sp_executesql @bulkinsert

仍然需要做一些工作才能将其用于代码中,但是对于50000行而不是一小时我们只需要25秒,所以这是一个巨大的进步!