2010-09-28 38 views
0

尊敬的 當面對system.outofmemmory異常時,如果綁定具有多於400000條記錄的數據表時,請查找下面的示例代碼以獲得相同的System.OutOfMemoryException將GridView綁定到具有多於400000條記錄的數據表

GridView gv = new GridView(); 
this.EnableViewState = false; 
gv.DataSource = (DataTable)dt; 
gv.DataBind(); 

請幫助我克服這種情況是否有任何數據綁定gridview的限制?

+6

誰願意查看400000條記錄的gridview? – SteveCav 2010-09-28 05:38:02

+1

即使您擁有無限內存的服務器,也不應從查詢返回400000條記錄。 :S爲什麼不在分頁查詢? [http://blog.sqlauthority.com/2007/04/03/sql-server-t-sql-paging-query-technique-comparison-sql-2000-vs-sql-2005/] – 2010-09-28 05:42:59

回答

2

數據網格受可用系統內存的限制,您可能會遇到這種情況。假設一個進程地址空間爲1.5GB,即每個數據網格行大約4KB,如果你有沒有其他的其他消耗內存在你的進程。 4KB不是不合理的,假設有十幾個寬的列。

您試圖一次顯示太多行。我必須假設這也是一個非常糟糕的用戶體驗,試圖瀏覽那麼多行。請看paging他們。

1

這是很多行!您需要對該行數應用分頁才能管理。如果您顯示多行的原因是您需要查找某些數據,則還應該執行搜索功能。

下面是從MS指導如何啓用分頁:http://msdn.microsoft.com/en-us/library/aa479347.aspx

+0

親愛的,我不是使用該網格視圖來顯示記錄我使用它將數據導出到Excel中有10條記錄,示例代碼。示例code.Response.ContentType =「application/vnd.ms-excel」; string FileName =「PoliciesDetailsForBranch」; Response.AppendHeader (「content-disposition」,「attachment; filename =」+ FileName +「.xls」); GridView gv = new GridView(); this.EnableViewState = false; gv.DataSource =(DataTable)dt; gv.DataBind ; this.ClearControls(gv); System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(Response.Output); gv.RenderControl(hw); Response.End(); – 2010-09-28 06:07:47

+6

然後你根本不應該使用DataGrid。一種替代方法是使用HtmlTextWriter並逐行地自行編寫輸出。但你應該真的考慮你爲什麼這樣做。 400.000行仍然很多,您在獲取數據時可能會面臨超時。這聽起來好像你正在返回所有已知的數據?如果是這樣,你應該在你的SQL數據庫中真正創建一個導出函數,將數據轉儲到一個excel文件中,並通過你的服務/頁面返回現有的文件。 – Merrimack 2010-09-28 06:09:59

2

正如已經建議,分頁處理大量的網絡應用程序中記錄的通用方式。

但是,如果需要顯示輸出中的所有記錄(例如,爲了報告目的),那麼有辦法做到這一點。

除了將結果集保存在服務器的內存中,您還可以將數據傳輸到客戶端。這可以通過使用DataReader而不是DataSet並禁用所有緩存機制來實現。

一個簡單的方法是使用一個SqlDataSource控件。像平常一樣將數據源連接到網格視圖。然後將數據源上的DataSourceMode從DataSet更改爲DataReader。禁用頁面輸出緩存,然後就可以開始了。

相關問題