Я использовал Microsoft ReportViewer в режиме Удаленный для просмотра отчетов, которые хранятся локально. Кажется, что код не может загрузить отчеты в SQL 2016 (при хорошей работе с SQL 2014) с NullReferenceException
по команде ServerReport.LoadReportDefinition(...)
.
Есть ли в моем коде ошибка или ReportViewer
ошибка? Какие-либо настройки пропущены?
Я знаю о Что такое исключение NullReferenceException и как его исправить? , но я получаю исключение из глубины кода Microsoft и ни один из объектов, к которым я могу получить доступ, не является нулевым .
Шаги для воспроизведения
- Создать новый проект winforms
- В Form1 добавить Reporting / ReportViever из панели инструментов (
reportViewer1
)
Install-Package Microsoft.ReportingServices.ReportViewerControl.Winforms
(установлена версия 140.1000.523 октябрь 2017 г.)
- Вставьте (с изменением пути к отчету и имени сервера) следующий код в форму Form1:
private void Form1_Load(object sender, EventArgs e)
{
reportViewer1.ProcessingMode = ProcessingMode.Remote;
reportViewer1.ShowCredentialPrompts = true;
reportViewer1.ServerReport.ReportServerUrl =new Uri("http://MyServer/ReportServer");
using (var tr = System.IO.File.OpenText(@"c:\ ... \MyReport.rdl"))
{
reportViewer1.ServerReport.LoadReportDefinition(tr);
}
this.reportViewer1.RefreshReport();
}
Когда MyServer
является SQL Server 2014, отчет отображается в средстве просмотра, как и ожидалось. Когда сервером является SQL Server 2016 (или даже 2017), я получаю NullReferenceException
и ReportServerException
(один за другим после F5 ) в строке reportViewer1.ServerReport.LoadReportDefinition
. Я считаю, что второе исключение является следствием первого.
Полное исключение:
Первый:
System.NullReferenceException was unhandled
HResult=-2147467261
Message=Object reference not set to an instance of an object.
Source=Microsoft.ReportViewer.WinForms
StackTrace:
at Microsoft.Reporting.WinForms.SoapReportExecutionService.SoapExecutionInfoToParametersLayout(ParametersPaneLayout paramPaneLayout, ExecutionInfo3 soapExecInfo3, ReportParameterInfoCollection paramInfoCollection)
at Microsoft.Reporting.WinForms.SoapReportExecutionService.FromSoapExecutionInfo(ExecutionInfo soapExecutionInfo)
at Microsoft.Reporting.WinForms.SoapReportExecutionService.LoadReportDefinition(Byte[] definition)
at Microsoft.Reporting.WinForms.ServerReport.LoadReportDefinition(TextReader report)
at SSRSTestC.Form1.Form1_Load(Object sender, EventArgs e) in C:\MyDiskArea\LiveProgProjects\SSRSTestC\SSRSTestC\Form1.cs:line 24
...
InnerException:
null
Второй
Microsoft.Reporting.WinForms.ReportServerException was unhandled
ErrorCode=rsInvalidReportDefinition
HResult=-2146233088
Message=The definition of this report is not valid or supported by this version of Reporting Services. The report definition may have been created with a later version of Reporting Services, or contain content that is not well-formed or not valid based on Reporting Services schemas. Details: Root element is missing. (rsInvalidReportDefinition)
Source=Microsoft.ReportViewer.WinForms
StackTrace:
at Microsoft.Reporting.WinForms.SoapReportExecutionService.ServerReportSoapProxy.OnSoapException(SoapException e)
at Microsoft.Reporting.WinForms.Internal.Soap.ReportingServices2005.Execution.RSExecutionConnection.ProxyMethodInvocation.Execute[TReturn](RSExecutionConnection connection, ProxyMethod`1 sql16Method, ProxyMethod`1 katmaiMethod, ProxyMethod`1 yukonMethod)
at Microsoft.Reporting.WinForms.Internal.Soap.ReportingServices2005.Execution.RSExecutionConnection.LoadReportDefinition(Byte[] Definition, Warning[]& warnings)
at Microsoft.Reporting.WinForms.SoapReportExecutionService.LoadReportDefinition(Byte[] definition)
at Microsoft.Reporting.WinForms.ServerReport.LoadReportDefinition(TextReader report)
at SSRSTestC.Form1.Form1_Load(Object sender, EventArgs e) in C:\MyDiskArea\LiveProgProjects\SSRSTestC\SSRSTestC\Form1.cs:line 24
...
InnerException:
null
Отчет, открываемый в Report Builder 2014 , может без проблем отображаться на обоих серверах. Если отчет уже загружен на сервер (.ReportPath =
заменяет .LoadReportDefinition(
), элемент управления Report Viewer может отобразить его.
Редактировать
О проблеме теперь сообщается Сбой средства просмотра отчетов Microsoft SSRS при загрузке отчета в Report Sever 2016