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

本文关键字:方法 应用程序 Excel 导入 MVC3 | 更新日期: 2023-09-27 18:37:05

我正在将CSV文件导入到我的 ASP.NET MVC3/C #/实体框架应用程序。

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

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并以这种方式插入?

谢谢

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

我喜欢你每 X 条记录只提交记录(在你的例子中为 100 条)。

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

最初我是用实体框架编写的,完成这部分任务需要 5-6 分钟。 SQL Profiler 向我展示了它正在执行 100,000 次 SQL 查询 - 每条记录一个更新和一个插入(正如我猜的那样)。

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

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

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

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

感谢 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

仍然需要做一些工作才能将其融入代码中,但是我们将 25 行的时间缩短到 50000 秒,而不是一个小时,所以这是一个巨大的改进!