«Произошла ошибка во время локальной обработки отчета». происходит случайным образом и останавливает последующие казни - PullRequest
0 голосов
/ 05 марта 2020

У меня есть DLL, которая запускается из планировщика задач, который использует Microsoft.Reporting.WinForms для печати отчетов SSRS с указанием имени отчета и набора параметров.

Это работает так:

using (ReportViewer reportViewer = new ReportViewer())
{
   reportViewer.Reset();
   reportViewer.ProcessingMode = ProcessingMode.Local;
   reportViewer.LocalReport.EnableExternalImages = true;
   reportViewer.LocalReport.EnableHyperlinks = true;
   reportViewer.LocalReport.ReportPath = reportFullName;

   if (parameters != null)
   {
       ReportParameterInfoCollection reportParameterInfoCollection = reportViewer.LocalReport.GetParameters();
       List<ReportParameter> reportParameterList = new List<ReportParameter>();

       foreach (KeyValuePair<string, object> element in parameters)
       {
           foreach (ReportParameterInfo reportParameterInfo in reportParameterInfoCollection)
           {
               if (reportParameterInfo.Name.ToUpper() == element.Key.ToUpper())
               {
                   if (element.Value == null)
                   {
                       throw new Exception(string.Format("Report parameter cannot be null. Parameter name {0}", reportParameterInfo.Name));
                   }

                   ReportParameter reportParameter = new ReportParameter();
                   reportParameter.Name = reportParameterInfo.Name;
                   reportParameter.Values.Add(element.Value.ToString());
                   reportParameterList.Add(reportParameter);
               }
           }
       }

       if (reportParameterList.Count > 0)
       {
           reportViewer.LocalReport.SetParameters(reportParameterList);
       }
   }

   using (SSRSUtility ssrsUtility = new SSRSUtility(msSqlDataManager))
   {
       //Populate the report with data
       ssrsUtility.ExtractDataSetInfoFromTheReport(reportViewer.LocalReport.ReportPath);
       foreach (string dataSetName in reportViewer.LocalReport.GetDataSourceNames())
       {
           DataTable dataTable = ssrsUtility.PopulateDataSet(dataSetName, reportViewer.LocalReport.GetParameters());
           if (dataTable == null)
               return null;
           reportViewer.LocalReport.DataSources.Add(new ReportDataSource(dataSetName, dataTable));
       }
       reportViewer.RefreshReport();

       Warning[] warnings = null;
       string[] streamIds = null;
       string mimeType = string.Empty;
       string encoding = string.Empty;
       string extension = string.Empty;
       string format = "PDF";

       byte[] bytes = reportViewer.LocalReport.Render(format, null,
           out mimeType, out encoding, out extension, out streamIds, out warnings);

       return bytes;
   }
}

Это прекрасно работает в течение определенного времени (от нескольких часов до нескольких дней), но, казалось бы, случайно я получу ошибку An error occurred during local report processing.. Когда это произойдет, любые последующие попытки запустить отчет будут терпеть неудачу с той же ошибкой, пока я не выпущу свою DLL, перезапустив планировщик задач.

Кажется, проблема не связана с данными, поступающими в отчет, так как запуск их с одинаковыми параметрами вручную не вызывает проблем. Я также проверил журналы SSRS, и там нет никаких проблем.

Насколько я могу судить, любые экземпляры отчета SSRS должным образом удаляются между каждым вызовом. Что может быть причиной того, что DLL удерживает плохой экземпляр SSRS до его полного перезапуска?

...