2012-01-06 83 views
1

任何人都可以帮助我如何解决我的asp页面上的内存不足错误?即时通讯使用LINQ到SQL ..后添加数据几个数据..像超过10行。在网格中。出现内存不足的错误..随函附上是我的外接功能..内存不足在行XXXX

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(); 
    } 
} 
+0

你在做什么'checkservicedetailid()'? – TheVillageIdiot 2012-01-06 06:25:10

+3

也代替'if(checkservicedetailid()!= null)'尝试'var obj = checkservicedetailid(); if(obj!= null)'后来替换'tblCashExpenses.ServiceDetailsID = checkservicedetailid().ServiceDetailsID;''tblCashExpenses.ServiceDetailsID = obj.ServiceDetailsID;' – TheVillageIdiot 2012-01-06 06:26:46

+0

Post CashExpense class properties here。 – adatapost 2012-01-06 06:28:39

回答

0

我尝试了所有的我的同龄人以及这里提供的,从GC.Collect的解决方案给我两个解决方案,以使用后处置等LINQ的datacontext然而,错误不断发生,我再试图删除更新面板,我读了一个网站,显示了如何处理数据esp当一个功能重复完成时,如何可笑的更新面板。噗!内存问题消失了!

0

我从你的代码在这里猜测:

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到对象,意思是:它将每行从表格加载到客户端并在本地进行测试。这会伤害内存,特别是如果为每行创建不同的数据库上下文。另外,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>>)

+0

嗨,继承人我的获取函数 public IEnumerable get(Expression > express) return {ServiceDetailsDB.ServiceDetails.Where(express); } – anonymous1110 2012-01-06 07:14:43

+0

那么我能做些什么来解决这个问题? – anonymous1110 2012-01-06 08:22:15

+0

@ anonymous1110如果是,就像你所建议的那样,一个表达式......然后 - 你可以做一个SQL跟踪(或者类似的)并且检查通过线路传输的数据是什么?查询是什么等等?主要检查:它在哪里过滤? – 2012-01-06 12:52:44