Импортируйте файл Excel в базу данных, используя Epplus и Sqlbulkcopy в MVC 5 - PullRequest
0 голосов
/ 14 мая 2019

Я импортирую большой файл данных из Excel в свою таблицу базы данных, используя библиотеку Epplus в MVC5 и Entity Framework 6. Копирование этого файла в базу данных занимает много времени. Я хочу использовать sqlbulkcopy для быстрой вставки данных, но я не совсем уверен, как это сделать внутри моего контроллера. Код работает сейчас, но для импорта всех данных в базу данных требуется много времени.

  public ActionResult Structure(FormCollection formCollection)
    {
        var usersList = new List<bomStructuredImportTgt>();
        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 bomStructuredImportTgt();
                        user.ActualDate = Convert.ToDateTime(workSheet.Cells[rowIterator, 1].Value);
                        user.Description = workSheet.Cells[rowIterator, 2].Value?.ToString();
                        user.Level = Convert.ToInt32(workSheet.Cells[rowIterator, 3].Value);
                        user.ParentPartNumber = workSheet.Cells[rowIterator, 4].Value?.ToString();
                        user.PartNumber = workSheet.Cells[rowIterator, 5].Value?.ToString();
                        user.PartName = workSheet.Cells[rowIterator, 6].Value?.ToString();
                        user.HNS = workSheet.Cells[rowIterator, 7].Value?.ToString();
                        user.DWGSZ = workSheet.Cells[rowIterator, 8].Value?.ToString();
                        user.Part = workSheet.Cells[rowIterator, 9].Value?.ToString();
                        user.L1Quantity = Convert.ToInt32(workSheet.Cells[rowIterator, 10].Value);
                        user.ColorM = workSheet.Cells[rowIterator, 11].Value?.ToString();
                        user.ATTCD = workSheet.Cells[rowIterator, 12].Value?.ToString();
                        user.KD = workSheet.Cells[rowIterator, 13].Value?.ToString();
                        user.Sell = workSheet.Cells[rowIterator, 14].Value?.ToString();
                        user.PlGroup = workSheet.Cells[rowIterator, 15].Value?.ToString();
                        user.PL1 = workSheet.Cells[rowIterator, 16].Value?.ToString();
                        user.AT1 = workSheet.Cells[rowIterator, 17].Value?.ToString();
                        user.PL2 = workSheet.Cells[rowIterator, 18].Value?.ToString();
                        user.AT2 = workSheet.Cells[rowIterator, 19].Value?.ToString();
                        user.PL3 = workSheet.Cells[rowIterator, 20].Value?.ToString();
                        user.Plant = workSheet.Cells[rowIterator, 21].Value?.ToString();
                        user.SHRPCMINMAX = workSheet.Cells[rowIterator, 22].Value?.ToString();
                        usersList.Add(user);
                    }
                }
            }
        }
        using (Dev_Purchasing_New_ModelEntities excelImportDBEntities = new Dev_Purchasing_New_ModelEntities())
        {
            foreach (var item in usersList)
            {
                excelImportDBEntities.bomStructuredImportTgts.Add(item);
            }
            excelImportDBEntities.SaveChanges();
        }
        return View("Structure");
    }

1 Ответ

0 голосов
/ 14 мая 2019

ИМХО , это не очень хорошая идея, чтобы загружать огромные результаты через веб-сайт напрямую, потому что:

  1. Не так просто использовать BULK или BCP из ASP.
  2. Вы заставите пользователя ждать окончания процесса.

А как насчет других подходов:

  1. используйте ETL (SSIS) для выполнения всех загрузок в базу данных и просто скопируйте Excel пользователя в какую-нибудь общую папку, где пакет SSIS может прочитать этот файл. После загрузки данных вы можете уведомить пользователя по электронной почте и дать ссылку на его / ее данные или использовать уведомление на веб-сайте.
  2. Так же, как первый, но без SSIS. Просто скопируйте файл в какой-нибудь общий ресурс, который может быть прочитан службой sql, и запустите BULK Insert with SQL. Но имейте в виду, что BULK-вставка работает с CSV-файлами.
  3. Так же, как первые два, но вместо массовой вставки или массового копирования вы можете попробовать команду OPENROWSET для чтения Excel, но вам потребуется установить некоторые драйверы на стороне сервера SQL.
...