【问题标题】:Microsoft Report Viewer 2012 exception "Not enough storage is available to process this command"Microsoft Report Viewer 2012 异常“没有足够的存储空间来处理此命令”
【发布时间】:2014-01-21 07:28:11
【问题描述】:

我有一个在 VS2012 中开发的 WCF 客户端应用程序。我使用 MS Report Viewer 2012 (Microsoft.ReportViewer.WinForms 11.0.3366.16) 在我的应用程序中执行和显示报告。问题是当这个报告在任何 32 位环境中执行时,我得到这个异常。有趣的是,它不会在不同的 32 位机器上同时发生。

  • 在某些机器上,它发生在数据显示在 报告。关于跟踪 64 位和 32 位机器之间的内存使用情况 我注意到在 64 位机器上,内存使用量飙升至 大约 1.3GB(应用程序的私有字节)。在 32 位 机器,它飙升到大约 650MB 的 RAM,然后给 例外。在 32 位机器上仍然有很多物理和 发生这种情况时会留下虚拟内存,这让我感到困惑。 如果您也继续,错误会不断弹出。

  • 在其他计算机上,当您将报告导出到 Excel 时会发生这种情况 报告无事呈现后。错误有点 不同但在您关闭异常时会间歇性变化,并且 其中一个错误是“存储空间不足”错误。

  • 当您从浏览器运行此报告时,它可以正常工作而无需 问题。

  • 周五我测试报告时,它在 2 32bit 上运行良好 机器没有问题,我以为问题解决了,但是 星期一来了,错误又回来了。我要求伙计们重新开始 有机器确保没有不必要的东西 加载到内存中,但没有运气。

我在互联网上发现了很多关于该错误的问题,但没有一个解决方案证明有效。有没有人可以给我一些关于寻找什么的见解,因为我不知道在哪里可以找到答案了。

报表数据集有大约 300,000 行,在报表中聚合到显示的大约 3,000 行。

如果需要更多详细信息,请询问。我需要解决这个问题。

编辑

这是我设置报告的一些代码。

void BaseReportingForm_Load(object sender, System.EventArgs e)
{

        rptViewer.ServerReport.ReportPath = "/test/TestReport";
        rptViewer.ServerReport.ReportServerUrl = new Uri("http://localhost:80/ReportServer");
        rptViewer.ServerReport.ReportServerCredentials.NetworkCredentials = new System.Net.NetworkCredential(
            "Developer", "Password", "Domain");
        rptViewer.ProcessingMode = Microsoft.Reporting.WinForms.ProcessingMode.Remote;
        rptViewer.ShowParameterPrompts = false;

        this.RefreshReport();
        //cant do this here as the parameters that are dynamically loaded will not be populated
        LoadParameters(null);
}

void RefreshReport()
{
    this.RefreshReport(null);
}

void RefreshReport(Microsoft.Reporting.WinForms.ReportParameterInfoCollection pParameters)
{
    //run in seperate thread...
    object[] argArr = new object[] { pParameters };
    if (reportBackgroundWorker.IsBusy)
    {
        restartWorker = true;
        reportBackgroundWorker.CancelAsync();
    }
    else
    {
        reportBackgroundWorker.RunWorkerAsync(argArr);
    }
}

void LoadParameters(Microsoft.Reporting.WinForms.ReportParameterInfoCollection pParameters)
{
    this.catchClick = false;
    if (pParameters != null) //only load the parameter collection
    {
        Microsoft.Reporting.WinForms.ReportParameterInfoCollection rptParameters = rptViewer.ServerReport.GetParameters();
        foreach (Microsoft.Reporting.WinForms.ReportParameterInfo rptParam in rptParameters)
        {
            if (rptParam.Prompt != "")
            {
                //Code removed. Just creating edits and combo's for parameters to be captured
            }
        }
    }
    else //reload whole group
    {
        //First delete the group if it exists

        //Get parameters and add it to the group as items
        string version = rptViewer.ServerReport.GetServerVersion();
        Microsoft.Reporting.WinForms.ReportParameterInfoCollection rptParameters = rptViewer.ServerReport.GetParameters();

        int paramPosition = 0;
        foreach (Microsoft.Reporting.WinForms.ReportParameterInfo rptParam in rptParameters)
        {
            if (rptParam.Prompt != "")
            {
                //Code removed. Just creating edits and combo's for parameters to be captured
            }
        }
    }
}

public void RunReport()
{
    this.RefreshReport();
}

private void reportBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    rptViewer.Invoke(new MethodInvoker(delegate()
    {
        //Removed the code that populates the parameters from the created edits and combo's and put some hardcoded params in here

        var vParameters = new List<Microsoft.Reporting.WinForms.ReportParameter>();
        vParameters.Add(new Microsoft.Reporting.WinForms.ReportParameter("Param1", "Param1"));
        rptViewer.ServerReport.SetParameters(vParameters);
        rptViewer.RefreshReport();
    }));
}

private void reportBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Cancelled && restartWorker)
    {
        restartWorker = false;
        this.RefreshReport();
    }

    if (e.Error != null)
    {
        throw e.Error;
    }
    else
    {

    }
}

编辑 2

根据我的研究,我找到了这个链接: http://unixwiz.net/techtips/not-enough-codes.html 似乎系统显式地耗尽了内存或句柄。追捕 MS 并希望他们回到男人身边是最好的行动理由吗?

谢谢

【问题讨论】:

    标签: c# reporting-services reportviewer


    【解决方案1】:

    一年后,我仍然没有收到正确的答案。我已经在 Report Viewer(版本 9)上回滚到以前的版本,它解决了问题,但我仍然不知道为什么版本 11 只能在 64 位系统上正常工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-23
      • 2015-01-22
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 2017-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多