Недостаточно памяти в строке XXXX - PullRequest
1 голос
/ 06 января 2012

Может кто-нибудь помочь мне, как устранить ошибку нехватки памяти на моей странице asp? я использую linq to sql .. после добавления данных несколько данных .. как более 10 строк. в сетке. возникает ошибка нехватки памяти .. прилагается моя функция добавления ..

public ServiceDetail checkservicedetailid()
{
    string ServiceName = ViewState["Tab"].ToString();
    ServiceDetail checkservicedetailid = ServiceDetails_worker.get(a => a.ServiceName == ServiceName && a.MarginAnalysisID == checkmarginanalysisid().MarginAnalysisID).SingleOrDefault();
    return checkservicedetailid;
}

public IEnumerable<ServiceDetail> get(Expression<Func<ServiceDetail, Boolean>> express)    
{ 
    return ServiceDetailsDB.ServiceDetails.Where(express); 
}

protected void btnSaveEmptyOC_Click(object sender, EventArgs e)
{
   try
   {
       if (checkservicedetailid() != null)
       {
           CashExpense tblCashExpenses = new CashExpense();
           Guid CashExpensesID = Guid.NewGuid();

           tblCashExpenses.CashExpensesID = CashExpensesID;
           tblCashExpenses.ServiceDetailsID = checkservicedetailid().ServiceDetailsID;
           tblCashExpenses.Description = txtDescriptionEmptyOC.Text;
           tblCashExpenses.Quantity = Decimal.Parse(txtQTYEmptyOC.Text);
           tblCashExpenses.UnitCost = Decimal.Parse(txtUnitCostEmptyOC.Text);
           tblCashExpenses.CreatedBy = User.Identity.Name;
           tblCashExpenses.DateCreated = DateTime.Now;
           tblCashExpenses.CashExpensesTypeID = "OTHER";

           CashExpenses_worker.insert(tblCashExpenses);
           CashExpenses_worker.submit();
           //Clear items after saving
           txtDescriptionEmptyOC.Text = "";
           txtQTYEmptyOC.Text = "";
           txtUnitCostEmptyOC.Text = "";
           ValidationMessage.ShowValidationMessage(MessageCenter.CashExpenseMaintenace.InsertOC2, "SaveEmptyOC", this.Page);
           MyAuditProvider.Insert(this.GetType().ToString(), ViewState["MarginAnalysisID"].ToString(), MessageCenter.Mode.ADD, MessageCenter.CashExpenseMaintenace.InsertOC2, Page.Request, User);
           divOtherCost.Visible = false;
           grd_othercost.Visible = true;
           btnaddothercost.Visible = true;
       }
       else
       {
           //Displays a Message on the Validation Summary (Service Id does not exist)
           ValidationMessage.ShowValidationMessage(MessageCenter.CashExpenseMaintenace.SaveServiceDetailOC, "SaveEmptyOC", this.Page);
       }
   }
   catch
   {
       //Displays a Message on the Validation Summary (Error on Saving)
       ValidationMessage.ShowValidationMessage(MessageCenter.CashExpenseMaintenace.InsertOCError, "SaveEmptyOC", this.Page);
   }

   finally
   {
       //Rebinds the Grid
       populategrd_othercost();
    }
}

Ответы [ 2 ]

0 голосов
/ 10 января 2012

Я испробовал все решения, предоставленные мне обоими коллегами, а также решение, предоставленное здесь, от GC.Collect, для удаления linq datacontext после использования и т. Д. Однако ошибка продолжает возникать, затем я попытался удалитьПанель обновления, я читал сайт, который показал, насколько нелепа панель обновлений, когда дело доходит до обработки данных, особенно когда функция выполняется неоднократно.И пшик!проблема с памятью исчезла!

0 голосов
/ 06 января 2012

Я думаю, из вашего кода здесь:

ServiceDetail checkservicedetailid = ServiceDetails_worker.get(
    a => a.ServiceName == ServiceName &&
         a.MarginAnalysisID == checkmarginanalysisid().MarginAnalysisID
).SingleOrDefault();

что .get() принимает Func<SomeType, bool>, а вы делаете что-то вроде:

var row = dbCtx.SomeTable.Where(predicate);

(пожалуйста, поправьте меня здесь, если я ошибаюсь)

Это, однако, использует LINQ-to-Objects, что означает: он загружает каждую строку из таблицы в клиент и тестирует локально. Это повредит памяти, особенно если для каждой строки создается отдельный контекст БД. Кроме того, вызов checkmarginanalysisid() выполняется для каждой строки, когда он предположительно не меняется между строками.

Вы должны проверить это с Expression<Func<SomeType, bool>>, который будет переведен на TSQL и выполнен на сервере. Вам также может понадобиться удалить непереводимые методы, т.е.

var marginAnalysisId = checkmarginanalysisid().MarginAnalysisID;
ServiceDetail checkservicedetailid = ServiceDetails_worker.get(
    a => a.ServiceName == ServiceName &&
         a.MarginAnalysisID == marginAnalysisId
).SingleOrDefault();

где это get(Expression<Func<SomeType, bool>>).

...