У меня есть 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 до его полного перезапуска?