GridView.DataBind()将大型数据集导出到Excel时出现内存不足异常

GridView.DataBind()将大型数据集导出到Excel时出现内存不足异常,gridview,asp.net-mvc-2,iis-6,windows-2003-webserver,system.web.ui.webcontrols,Gridview,Asp.net Mvc 2,Iis 6,Windows 2003 Webserver,System.web.ui.webcontrols,我已将“导出到Excel”按钮添加到jqGrid中。在我将jqGrid链接到一个大型GridView之前,它工作得很好,该GridView有20000条记录,每个记录有200个字段(列) 我在DataBind()调用上得到了{“类型为'System.OutOfMemoryException'的异常。”}: public void ExportToExcel() { 如果(会话[“查询”]==null | |会话[“fieldNameAsDef”]==null) { 返回; } var grid=

我已将“导出到Excel”按钮添加到jqGrid中。在我将jqGrid链接到一个大型GridView之前,它工作得很好,该GridView有20000条记录,每个记录有200个字段(列)

我在DataBind()调用上得到了{“类型为'System.OutOfMemoryException'的异常。”}:

public void ExportToExcel()
{
如果(会话[“查询”]==null | |会话[“fieldNameAsDef”]==null)
{
返回;
}
var grid=new GridView();
List fieldNameAsDef=(List)会话[“fieldNameAsDef”];
grid.DataSource=((IQueryable)会话[“query”])。选择(“新建(“+string.Join”(,“,fieldNameAsDef.ToArray())+”);
grid.DataBind();
Response.ClearContent();
AddHeader(“内容处置”、“附件;文件名=EDGE_ExcelFile.xls”);
Response.ContentType=“应用程序/excel”;
StringWriter sw=新的StringWriter();
HtmlTextWriter htw=新的HtmlTextWriter(sw);
网格渲染控制(htw);
Response.Write(sw.ToString());
Response.End();
}
这是System.Web.UI.WebControl.GridView的限制吗? 或者是IIS 6和MVC2问题


jqGrid及其作为数据源的GridView是运行在Windows 2003 SP2服务器上的旧版MVC 2应用程序的一部分,具有IIS 6和4GB的RAM。

我当时正在观察Windows任务管理器,它的RAM“PF使用量”没有超过2GB。服务器有4GB可用空间,但我想每个应用程序只有1GB可用空间。jqGrid没有“导出到Excel”按钮。您是否使用基于jqGrid的商业产品?是否按照
loadonce:true
加载网格中的所有20000行?在服务器端导出到Excel不是更好吗?有关代码示例,请参见。可以下载答案中的演示项目。实际上,是System.Web.UI.WebControl.GridView.DataBind()调用在服务器端抛出内存不足异常,而不是jqGrid。将1个大数据分解为较小的卡盘,并将其一点一点地发送到GridView(较小的内存占用)。但是,在使用jqGrid或GridView导出到Excel时,问题是web浏览器不执行HTTP头,这意味着您必须从web服务器执行此操作。(一种方法是发送回服务器,但由于开销原因,这并不理想)。谢谢,我正在阅读MSDN。看来我必须缓冲数据。
    public void ExportToExcel()
    {

        if (Session["query"] == null || Session["fieldNameAsDef"] == null)
        {
            return;
        }
        var grid = new GridView();
        List<string> fieldNameAsDef = (List<string>)Session["fieldNameAsDef"];
        grid.DataSource = ((IQueryable)Session["query"]).Select("new (" + string.Join(",", fieldNameAsDef.ToArray()) + ")");
        grid.DataBind();

        Response.ClearContent();
        Response.AddHeader("content-disposition", "attachment; filename=EDGE_ExcelFile.xls");
        Response.ContentType = "application/excel";
        StringWriter sw = new StringWriter();
        HtmlTextWriter htw = new HtmlTextWriter(sw);
        grid.RenderControl(htw);
        Response.Write(sw.ToString());
        Response.End();
    }