gridview上的System.OutOfMemoryException

时间:2014-01-14 14:47:38

标签: c# asp.net gridview

我的申请存在问题。

首先,抱歉我的英语,我来自智利,我还在学习。

我有一个方法可以为Excel提供来自db的信息。客户不需要在屏幕上看到报告,他们只需要从应用程序下载它。

此方法调用存储过程,该过程会提供过多数据(大约600列和20000行),因此,当将表分配给GridView时,在DataBind()上会抛出System.OutOfMemoryException

还有其他方法可以使用数据加载GridView吗?我无法过滤查询或简化它,因为客户需要报告中的每个日期。 我正在使用Visual Studio 2010,Framework 4.0,SQL Server 2008。

这是方法:

private void getsReport()
{
    string reportName = "Globarl_Report_" +     User.Identity.Name + "_" + DateTime.Now.ToString("yyyyMMdd")+".xls";
    Database db = DatabaseFactory.CreateDatabase(ConfigurationManager.AppSettings["SNAT"].ToString());
    DBCommandWrapper com = db.GetSqlStringCommandWrapper("usp_con_global_report);// sp that give report.

    com.CommandTimeout = 360;

    StringBuilder sb = new StringBuilder();
    StringWriter sw = new StringWriter(sb);
    HtmlTextWriter htw = new HtmlTextWriter(sw);
    Page pagina = new Page();
    HtmlForm form = new HtmlForm();
    DataTable tabla = db.ExecuteDataSet(com).Tables[0]; ;
    GridView dg = new GridView();

    dg.EnableViewState = false;
    dg.DataSource = tabla;
    dg.DataBind();//THIS LINES THROWS EXCEPTION!!
    pagina.EnableEventValidation = false;
    pagina.DesignerInitialize();
    pagina.Controls.Add(form);
    form.Controls.Add(dg);
    pagina.RenderControl(htw);
    Response.Clear();
    Response.Buffer = true;
    Response.ContentType = "application/vnd.ms-excel";
    Response.AddHeader("Content-Disposition", "attachment;filename=" + nombreArchivo);
    Response.Charset = "UTF-8";
    Response.ContentEncoding = Encoding.Default;
    Response.Write(sb.ToString());
    Response.End();
}

感谢您的帮助!!

2 个答案:

答案 0 :(得分:0)

您应该在网格视图中添加寻呼机。

请看这里:Paging and Sorting the GridView's Data

答案 1 :(得分:0)

您是否正在将所有数据加载到grig以便只能导出到Excel?

在这种情况下,您可以在服务器上创建csv文件(通过计划或动态客户端请求)并在页面上放置链接以下载它。

稍后可以使用Excel(或任何其他电子表格处理器)打开它