![](/img/trans.png)
[英]Diagnose “Not enough storage is available to process this command” exception
[英]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.