我有一個在VS2012中開發的WCF客戶端應用程序。我使用MS Report Viewer 2012(Microsoft.ReportViewer.WinForms 11.0.3366.16)在我的應用程序中執行並顯示報告。問題是,當這個報告在任何32位環境中執行時,我會得到這個異常。有趣的是,它不會發生在不同的32位機器上。Microsoft Report Viewer 2012例外「沒有足夠的存儲空間來處理此命令」
在某些機器上,它發生在數據顯示在 報告中之前。在跟蹤64位和32位機器之間的內存使用情況時,我注意到,在64位機器上,內存使用率增加到了大約1.3GB(應用程序的專用字節),達到 。在32位的 機器上,它達到650MB左右的內存,然後出現 異常。在32位機器上,當發生這種情況時,仍然有很多物理和虛擬內存,這就是困擾我的東西。 如果繼續,錯誤會不斷彈出。
在其他機器上出現報告呈現後沒有發生事件後將報告導出到Excel 。該錯誤與 有點不同,但會在您關閉異常時間歇性地更改,並且 其中一個錯誤是「存儲空間不足」錯誤。
當您從瀏覽器運行此報告時,它工作正常,沒有 問題。
上週五,當我測試的報告,它完美地工作在2臺32位 機器沒有問題,而且我認爲這個問題是解決了,但 週一來了,錯誤又回來了。我問那些傢伙重新啓動 那裏的機器,以確保沒有不必要的事情是 加載在內存中,但沒有運氣。
我發現很多關於互聯網上的錯誤的問題,但沒有任何解決方案證明工作。有沒有人可以給我一些洞察力以尋找什麼,因爲我不知道在哪裏找到答案了。
報表數據集包含大約300,000行,報表中彙總了大約3000行。
如果需要更多的細節,請詢問。我需要解決這個問題。
編輯
下面是一些我的代碼設置的報告。
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
{
}
}
EDIT 2
從我的研究,我發現這個鏈接: http://unixwiz.net/techtips/not-enough-codes.html 看來,制度明確耗盡內存或句柄。是追求MS的行動的最好的原因,並希望他們回到一個男人?
謝謝