У меня есть клиентское приложение WCF, разработанное в VS2012. Я использую MS Report Viewer 2012 (Microsoft.ReportViewer.WinForms 11.0.3366.16) для выполнения и отображения отчета в моем приложении. Проблема в том, что когда этот отчет выполняется в любой 32-битной среде, я получаю это исключение. Интересно то, что это не происходит в одном и том же месте на разных 32-битных машинах.Исключение Microsoft Report Viewer 2012 «Недостаточно памяти для обработки этой команды»
На некоторых машинах это происходит только перед записью данных отображается в отчете о . При отслеживании использования памяти между 64-битной и 32-битной машиной Я заметил, что на 64-битной машине шип памяти используется для около 1,3 ГБ (частные байты для приложения). На 32-битной машине она генерирует около 650 МБ ОЗУ и затем дает исключение . На 32-битной машине осталось много физической и виртуальной памяти, когда это происходит, и это то, что меня озадачивает. Ошибка продолжает появляться, если продолжить.
На других машинах это происходит, когда вы экспортируете отчет в Excel после того, как отчет отображается без инцидентов. Ошибка - это бит другой, но с перерывами меняется при закрытии исключения, а одной из ошибок является ошибка «Недостаточно памяти».
При запуске этого отчета из браузера он отлично работает без проблемы .
В пятницу, когда я тестировал отчет, она работала отлично на 2 32bit машин без проблем, и я думал, что проблема решена, но понедельник пришел, и ошибка была обратно. Я попросил ребят перезагрузить там машины, чтобы убедиться, что ничего лишнего нет загружен в память, но не повезло.
Я нахожу много проблем, связанных с ошибкой в Интернете, но ни один из доказательств решений для работы. Есть ли кто-нибудь, который может дать мне некоторое представление о том, что искать, потому что я не уверен, где найти ответ.
В наборе данных отчета имеется около 300 000 строк, которые агрегируются в отчете примерно до 3000 строк.
Если вам требуется более подробная информация, обратитесь к нам. Мне нужно решить эту проблему.
EDIT
Вот некоторые из моих настраиваете отчет кода.
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, и надеемся, что они вернутся к человеку?
Благодаря