繁体   English   中英

Microsoft Report Viewer 2012异常“没有足够的存储空间来处理此命令”

[英]Microsoft Report Viewer 2012 exception “Not enough storage is available to process this command”

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

  • 在某些计算机上,它只是在报表中显示数据之前发生。 在跟踪64位和32位计算机之间的内存使用情况时,我注意到在64位计算机上,内存使用率飙升至约1.3GB(应用程序的专用字节)。 在32位计算机上,它的峰值内存约为650MB,然后给出异常。 发生这种情况时,在32位计算机上仍然有大量物理和虚拟内存,这让我感到困惑。 如果您继续,该错误也会不断弹出。

  • 在其他计算机上,报表呈现成功后将报表导出到Excel时会发生这种情况。 该错误略有不同,但在您关闭异常时会间歇性地更改,并且其中一个错误是“存储空间不足”错误。

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

  • 星期五,当我测试报告时,它在2台32位计算机上完美运行,没有问题,我认为问题已解决,但是星期一到了,错误又回来了。 我要求他们重新启动计算机,以确保没有不必要的东西被加载到内存中,但是没有运气。

我在互联网上发现了很多有关该错误的问题,但没有一种解决方案证明有效。 是否有人可以为我寻找所需的信息提供帮助,因为我不确定在哪里可以找到答案。

报告数据集具有约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陷入困境并希望他们回到男人身边的最佳动因吗?

谢谢

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM