2014-01-21 3 views
2

У меня есть клиентское приложение 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, и надеемся, что они вернутся к человеку?

Благодаря

ответ

1

Через год я до сих пор не получил должного ответа на это. Я вернулась к предыдущей версии в Report Viewer (версия 9), и она решила проблему, но я до сих пор не знаю, почему версия 11 работает только на 64-битных системах.

Смежные вопросы