2012-01-06 50 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