Проблемы SSRS ReportViewer со встроенным источником данных XML
У меня есть приложение C# (WPF), в котором я хочу отобразить отчет SSRS в элементе управления ReportViewer. В локальный файл отчета встроен источник данных XML. Отчет отображается правильно при запуске из SQL Server Business Intelligence Development Studio. Но когда я запускаю свое приложение, я получаю следующую ошибку:
A data source instance has not been supplied for the data source '...'.
Итак, вот что я делаю:
Я определил встроенные данные XML, как объяснено в этом руководстве. Определение набора данных отчета из встроенных данных XML. У меня есть источник данных под названием XmlDataSource_TopCustomers
и набор данных под названием XmlDataSet_TopCustomers
, используя этот источник данных. Я сослался на набор данных в таблице и диаграмме. В целом, RDL выглядит следующим образом (конечно, просто необходимым):
XmlDataSet_TopCustomers DataSetName> Tablix> XmlDataSet_TopCustomers DataSetName> Chart> ReportItems> Body> XML DataProvider> ConnectionProperties> <Е: SecurityType>None е: SecurityType> <Е: DataSourceID>47833b52-231f-4634-8af4-3c63272b02a7 е: DataSourceID> DataSource> DataSources> XmlDataSource_TopCustomers DataSourceName> Root /CustomerOrder {@CustomerNo, @CustomerName, @OrdersCount (Integer), @Total(Float), @AveragePerOrder(Float)} ElementPath> Root> XMLDATA> Query> CommandText> <Е: UseGenericDesigner>True е: UseGenericDesigner> Query> <Поля>... DataSets> <Й: ReportUnitType>Inch е: ReportUnitType> <Е: ReportID>02172db8-2a1d-4c35-9555-b37ee6193544 е: ReportID> Report>
На данный момент все отлично работает из IDE.
В моем приложении C# у меня есть ReportViewer и следующий код:
Viewer.LocalReport.ReportPath = @"<actualpath>\TopCustomers.rdl"; // actual path is OK
Viewer.RefreshReport();
И тогда я получаю это
A data source instance has not been supplied for the data source 'XmlDataSet_TopCustomers'.
Я видел других, имеющих такую же проблему, но в большинстве случаев проблема заключается в нескольких источниках данных, что здесь не так, как вы можете видеть из фрагмента RDL выше.
Какие-либо предложения?
3 ответа
Ответ на мой вопрос также можно найти здесь. Когда использовать отчеты RDLC поверх RDL? и здесь http://www.gotreportviewer.com/. Это в основном это:
В отличие от сервера отчетов элемент управления ReportViewer не подключается к базам данных и не выполняет запросы. Кроме того, в локальном режиме доступны только форматы экспорта Excel, Word и PDF. (В удаленном режиме доступны все форматы, поддерживаемые сервером отчетов.) Элемент управления ReportViewer нельзя расширить путем добавления пользовательских средств визуализации или пользовательских элементов отчета.
Дополнительную информацию можно найти здесь http://msdn.microsoft.com/en-us/library/ms252109(v=vs.80).aspx.
Элемент управления ReportViewer, который обрабатывает файлы.rdlc, игнорирует элемент RDL. Если определение отчета содержит запрос, элемент управления не будет его обрабатывать.
а также
При преобразовании файла.rdl в формат.rdlc необходимо вручную заменить источник данных и информацию запроса в определении отчета на структуры данных, предоставленные в вашем приложении.
Таким образом, вы должны получить данные в явном виде и предоставить для ReportViewer
как ReportDataSource
с тем же именем, что и набор данных в файле RDL.
Я не уверен из того, что вы указали, если источник данных указал учетные данные.
Эта часть здесь:
<ConnectionProperties>
<DataProvider>XML</DataProvider>
<ConnectString />
</ConnectionProperties>
Вообще говоря, с источниками данных SQL, когда отчеты не могут быть просмотрены для других или из приложений, это происходит из-за того, что хост-сервер принимает учетные данные, отличные от вашей IDE, создающей приложение. Он не знает, если меня зовут Бретт, что мои учетные данные запускают его при удаленном вызове. Когда вы указываете учетные данные на сервере, на котором размещается отчет, вы обычно можете обойти это. Вы заходите на сервер, на котором размещен отчет, я предполагаю, что вы делаете это, так как у вас есть отчет "rdl" вместо отчета rdlc. Найдите источник данных, щелкните свойства, измените настройку на "использовать эти учетные данные". Поставьте учетные данные, которые вы знаете, работают.
Это может решить проблему. Я не уверен с соединениями Sharepoint и XML-соединениями, но это часто встречается при просмотре проблем с соединениями SQL Server.
У меня есть небольшое приложение командной строки, которое делает что-то похожее, но между определением пути к отчету и выполнением каких-либо действий с помощью средства просмотра отчетов, я устанавливаю источник данных для отчета, с которым нужно работать:
report.DataSources.Add(new ReportDataSource("DataSet_for_Distribution", table));
... таблица является таблицей данных.
После этого у меня не возникает проблем с программным вызовом метода Render для отчета.
Можете ли вы установить перерыв перед рендерингом и посмотреть, какие источники данных на самом деле есть в отчете?
Еще одна вещь, которую можно попробовать, и, возможно, вы просто отформатировали ее (или отформатировали в стеке), чтобы опубликовать ее здесь, но когда я встраиваю набор данных XML в отчет, он все использует такой формат:
<CommandText><Query>
<ElementPath>Root /S {@OrderDate (Date), @TotalDue (Decimal)} /C {@LastName} </ElementPath>
<XmlData>
<Root>
<S OrderDate="2003-07-01T00:00:00" SalesOrderNumber="SO51131" TotalDue="247913.9138">
<C FirstName="Shu" LastName="Ito" />
</S>
<S OrderDate="2003-10-01T00:00:00" SalesOrderNumber="SO55282" TotalDue="227737.7215">
<C FirstName="Shu" LastName="Ito" />
</S>
<S OrderDate="2002-07-01T00:00:00" SalesOrderNumber="SO46616" TotalDue="207058.3754">
<C FirstName="Jae" LastName="Pak" />
</S>
<S OrderDate="2002-08-01T00:00:00" SalesOrderNumber="SO46981" TotalDue="201490.4144">
<C FirstName="Ranjit" LastName="Varkey Chudukatil" />
</S>
<S OrderDate="2002-09-01T00:00:00" SalesOrderNumber="SO47395" TotalDue="198628.3054">
<C FirstName="Michael" LastName="Blythe" />
</S>
</Root>
</XmlData>
</Query></CommandText>