Как ускорить проверку данных загрузки файла ASP.NET MVC Excel в соответствии с хранимой процедурой

asp.net-mvc linq stored-procedures

500 просмотра

1 ответ

335 Репутация автора

У меня есть приложение ASP.NET MVC, которое загружает файл Excel с элементами, которые необходимо проверить с помощью хранимой процедуры. Этот процесс работает хорошо, если в файле Excel есть несколько записей, но теперь, если у меня более ста строк, проверка выполняется очень медленно.

Есть ли способ как-нибудь ускорить его процесс? В основном я записываю данные из файла Excel в базу данных SQL Server, где проверяю данные по хранимой процедуре. Когда у меня около 50 записей, он выполняется быстрее, как только у меня более 100, это очень медленно. Пожалуйста, посмотрите мой код ниже и посоветуйте.

public ActionResult ValidateClaims()
{
        var domainNameOfficial = Session["domainName"];
        int sessionIdentifier = (int)Session["sessionID"];

        var claimsRecords = db.CleanSupplierClaims.Where(x => x.CleanSupplierClaimsUploadSessionID == sessionIdentifier).ToList();

        List<CleanSupplierClaim> supplierClaimsData = claimsRecords; //(List<CleanSupplierClaim>)TempData["supplierClaimsData"];    //= new List<CleanSupplierClaim>();// = claimsRecords;// My issue is here, I get all records and not the ones the user just uploaded

        CleanSupplierClaimData supplierClaimUplaod = new CleanSupplierClaimData();

        var sqlConnection = "data source=XXXXX;initial catalog=Embrace; User ID=XXXXX; Password=XXXXXXXX;";

        using (SqlConnection conn = new SqlConnection(sqlConnection))
        {
            try
            {
                foreach (var claim in supplierClaimsData)
                {
                    SqlCommand cmd = new SqlCommand();
                    cmd.CommandTimeout = 60;
                    cmd.CommandText = "CRM.Supplier_Claim_Upload";
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.Add("@Invoice", SqlDbType.NVarChar).Value = claim.Line_Number;
                    cmd.Parameters.Add("@Amount", SqlDbType.Decimal).Value = claim.Total_Claim;

                    cmd.Connection = conn;

                    conn.Open();

                    SqlDataReader reader = cmd.ExecuteReader();

                    while (reader.Read())
                    {
                        claim.ST_Key = reader.GetString(reader.GetOrdinal("ST_Key"));
                        claim.Error_1 = reader.GetString(reader.GetOrdinal("Error1"));

                        string lineNumberDoesNotExist = "Error: Invoice line number does not exist";
                        if (claim.Error_1.StartsWith(lineNumberDoesNotExist))
                        {
                            continue;
                        }

                        claim.Warning = reader.GetString(reader.GetOrdinal("Warning"));
                        claim.Error_2 = reader.GetString(reader.GetOrdinal("Error2"));
                        string warningCleanInclusion = "Warning";

                        if (claim.ST_Key != null && string.IsNullOrEmpty(claim.Warning) && string.IsNullOrEmpty(claim.Error_1) && string.IsNullOrEmpty(claim.Error_2))
                        {
                            var existingClaimCount = db.GPClaimsReadyToImports.Count(a => a.ST_Key == claim.ST_Key && a.CleanSupplierClaimSessionID == claim.CleanSupplierClaimsUploadSessionID);
                            if (existingClaimCount == 0)

                                db.GPClaimsReadyToImports.Add(new GPClaimsReadyToImport
                                {
                                    Id = claim.Id,
                                    ST_Key = claim.ST_Key,
                                    Warning = claim.Warning,
                                    Action = claim.Action,
                                    Claim_Reference = claim.ClaimReference,
                                    Currency = claim.Currency,
                                    Error_1 = claim.Error_1,
                                    Error_2 = claim.Error_2,
                                    Line_Number = claim.Line_Number,
                                    Total_Claim = claim.Total_Claim,
                                    Domain_Username = domainNameOfficial.ToString(),//claim.Domain_Username,
                                    DateCreated = DateTime.Now,
                                    ImportFlag = true,
                                    ReadyForImport = true,
                                    CleanSupplierClaimSessionID = sessionIdentifier
                                });
                            db.SaveChanges();
                       }
                    }

                    foreach (CleanSupplierClaim saveToDBClaim in supplierClaimsData)
                    {
                        db.CleanSupplierClaims.Attach(saveToDBClaim);

                        var entry = db.Entry(saveToDBClaim);
                        entry.Property(aa => aa.Line_Number).IsModified = true;
                        entry.Property(aa => aa.Total_Claim).IsModified = true;
                        entry.Property(aa => aa.Currency).IsModified = true;
                        entry.Property(aa => aa.ClaimReference).IsModified = true;
                        entry.Property(aa => aa.Action).IsModified = true;
                        entry.Property(aa => aa.Domain_Username).IsModified = true;
                        entry.Property(aa => aa.Error_1).IsModified = true;
                        entry.Property(aa => aa.Error_2).IsModified = true;
                        entry.Property(aa => aa.Warning).IsModified = true;
                        entry.Property(aa => aa.ImportFlag).IsModified = true;
                        entry.Property(aa => aa.ReadyForImport).IsModified = true;
                        db.Entry(saveToDBClaim).State = System.Data.Entity.EntityState.Modified;
                        db.SaveChanges();
                    }

                    conn.Close();
                }
            }
            catch (Exception ex)
            {
                ViewBag.Error = ex.Message + ex.InnerException;
            }

            var warningCount = "Warning";
            var errorOneCont = "Error";
            var errorTwo = "ErrorTwo";

            var countWarning = supplierClaimsData.Select(x => x.Warning).Count();

            var countErrorOne = supplierClaimsData.Select(x => x.Error_1).Count();
            var countErrorTwo = supplierClaimsData.Select(x => x.Error_2).Count();

            var officialWarning = String.Concat("Warning", countWarning);

            ViewBag.WarningCount = officialWarning;
            ViewBag.ErrorOneCount = countErrorOne;
            ViewBag.ErrorTwoCount = countErrorTwo;

            Session["supplierClaimsData"] = supplierClaimsData;

            return View("ValidateClaims", supplierClaimsData);
        }
    }
Автор: Papi Источник Размещён: 18.07.2016 01:41

Ответы (1)


1 плюс

155 Репутация автора

Я рекомендую использовать EPPLUS Plugin, доступный от NuGet.

https://www.nuget.org/packages/EPPlus/

Я использовал его для моего большого Excel, и он работал отлично и быстро, и OLEDB не требуется во время выполнения.

Вы можете найти краткое руководство здесь:

http://zeeshanumardotnet.blogspot.com/2011/06/creating-reports-in-excel-2007-using.html

Автор: Salman Zahid Размещён: 19.07.2016 11:07
Вопросы из категории :
32x32