C# Microsoft Report Viewer 2012例外情况“;存储空间不足,无法处理此命令;
我在VS2012中开发了一个WCF客户端应用程序。我使用MS Report Viewer 2012(Microsoft.ReportViewer.WinForms 11.0.3366.16)在我的应用程序中执行和显示报告。问题是,当此报告在任何32位环境中执行时,我都会遇到此异常。有趣的是,在不同的32位机器上,它不会发生在同一点上C# Microsoft Report Viewer 2012例外情况“;存储空间不足,无法处理此命令;,c#,reporting-services,reportviewer,C#,Reporting Services,Reportviewer,我在VS2012中开发了一个WCF客户端应用程序。我使用MS Report Viewer 2012(Microsoft.ReportViewer.WinForms 11.0.3366.16)在我的应用程序中执行和显示报告。问题是,当此报告在任何32位环境中执行时,我都会遇到此异常。有趣的是,在不同的32位机器上,它不会发生在同一点上 在某些机器上,它发生在数据显示在屏幕上之前 报告。关于跟踪64位和32位计算机之间的内存使用情况 我注意到,在64位机器上,内存使用峰值为 大约1.3GB(应用程
- 在某些机器上,它发生在数据显示在屏幕上之前 报告。关于跟踪64位和32位计算机之间的内存使用情况 我注意到,在64位机器上,内存使用峰值为 大约1.3GB(应用程序的专用字节)。在32位上 机器,它会将内存增加到650MB左右,然后给出 例外。在32位机器上,仍然存在大量物理和物理数据 发生这种情况时留下的虚拟内存,这让我感到困惑。 如果继续,错误会不断弹出
- 在其他计算机上,将报表导出到Excel时会发生这种情况 报告提交后无任何意外。这个错误有点小 不同,但在关闭异常时会间歇性更改,以及 其中一个错误是“存储空间不足”错误
- 当您从浏览器运行此报告时,它在没有 问题
- 周五,当我测试报告时,它在32bit上运行得非常好 机器没有问题,我以为问题解决了,但是 星期一到了,错误又回来了。我让他们重新开始 有机器来确保没有不必要的东西 载入记忆,但没有运气
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
{
}
}
void BaseReportingForm\u加载(对象发送方,System.EventArgs e)
{
rptViewer.ServerReport.ReportPath=“/test/TestReport”;
rptViewer.ServerReport.ReportServerUrl=新Uri(“http://localhost:80/ReportServer");
rptViewer.ServerReport.ReportServerCredentials.NetworkCredentials=新系统.Net.NetworkCredential(
“开发者”、“密码”、“域”);
rptViewer.ProcessingMode=Microsoft.Reporting.WinForms.ProcessingMode.Remote;
rptViewer.showParameterPerCompts=false;
此.RefreshReport();
//此处无法执行此操作,因为动态加载的参数将不会填充
LoadParameters(null);
}
作废报告()
{
此.RefreshReport(空);
}
无效刷新报告(Microsoft.Reporting.WinForms.ReportParameterInfoCollection pParameters)
{
//在单独的线程中运行。。。
对象[]argArr=新对象[]{pParameters};
如果(reportBackgroundWorker.IsBusy)
{
restartWorker=true;
reportBackgroundWorker.CancelAsync();
}
其他的
{
reportBackgroundWorker.RunWorkerAsync(argArr);
}
}
void LoadParameters(Microsoft.Reporting.WinForms.ReportParameterInfo集合参数)
{
this.catchClick=false;
if(pParameters!=null)//仅加载参数集合
{
Microsoft.Reporting.WinForms.ReportParameterInfo收集rptParameters=rptViewer.ServerReport.GetParameters();
foreach(rptParameters中的Microsoft.Reporting.WinForms.ReportParameterInfo rptParam)
{
如果(rptParam.Prompt!=“”)
{
//代码已删除。只需为要捕获的参数创建编辑和组合
}
}
}
否则//重新加载整个组
{
//首先删除组(如果存在)
//获取参数并将其作为项目添加到组中
string version=rptViewer.ServerReport.GetServerVersion();
Microsoft.Reporting.WinForms.ReportParameterInfo收集rptParameters=rptViewer.ServerReport.GetParameters();
int paramPosition=0;
foreach(rptParameters中的Microsoft.Reporting.WinForms.ReportParameterInfo rptParam)
{
如果(rptParam.Prompt!=“”)
{
//代码已删除。只需为要捕获的参数创建编辑和组合
}
}
}
}
公共报告()
{
此.RefreshReport();
}
私有无效报告BackgroundWorker_DoWork(对象发送方,DoWorkEventArgs e)
{
Invoke(新的MethodInvoker(delegate())
{
//从创建的编辑和组合中删除了填充参数的代码,并在此处放置了一些硬编码的参数
var vParameters=新列表();
添加(新的Microsoft.Reporting.WinForms.ReportParameters(“Param1”、“Param1”));
rptViewer.ServerReport.SetParameters(vpParameters);
rptViewer.RefreshReport();
}));
}
private void reportBackgroundWorker_RunWorkerCompleted(对象发送方,RunWorkerCompletedEventArgs e)
{
如果(如取消和重新启动)
{
restartWorker=false;
此.RefreshReport();
}
如果(例如错误!=null)
{
抛出e.错误;
}
其他的
{
}
}
编辑2
从我的研究中,我发现了以下链接:
系统似乎显式地耗尽了内存或句柄。是不是最好的行动理由去追问MS,并希望他们回到一个男人身边
谢谢一年后,我仍然没有收到关于这个问题的正确答案。我已经在Report Viewer上回滚到以前的版本(版本9),它解决了这个问题,但我仍然不知道为什么版本11只能在64位系统上正常工作