c# - Microsoft Report Viewer 2012 异常 "Not enough storage is available to process this command"

标签 c# reporting-services reportviewer

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

  • 在某些机器上,它发生在数据显示在 报告。关于跟踪 64 位和 32 位机器之间的内存使用情况 我注意到在 64 位机器上内存使用率飙升到 大约 1.3GB(应用程序的专用字节)。在 32 位上 机器,它飙升到大约 650MB 的 RAM,然后给出 异常(exception)。在 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 位系统上正常工作

关于c# - Microsoft Report Viewer 2012 异常 "Not enough storage is available to process this command",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21251811/

相关文章:

c# - 批量查询异常

reporting-services - 从 BIDS 部署到 SSRS - 参数未更新

c# - ReportViewer 2010 不刷新异步回发

c# - 如何使用 UWP C# 创建 PDF 文件?

c# - 将防伪与 Ajax 或 AngularJs 结合使用

c# - XML 序列化嵌套

c# - 在 Reporting Services 中重用来自 MVC 应用程序 (DLL) 的业务逻辑

sorting - SSRS 2008 交互式矩阵排序不起作用

c# - 未知服务器标记 'rsweb:ReportViewer'

reporting-services - 在RDLC中制作 "Banded"报告最简单的方法是什么?