SSRS — загрузить источник данных после отчета

Я создаю приложение MVC, которое использует веб-службу отчетов (2010) для программного управления отчетами и источниками данных.

Примерно месяц назад, когда я впервые реализовал эту функцию, я смог сначала загрузить отчеты (файлы .rdl), а затем загрузить источник данных. Затем я смог просмотреть отчет, используя элемент управления просмотра отчетов на веб-странице.

Однако примерно через неделю этот поток прервался, т.е. если я сначала загружаю отчет, а затем источник данных, отчет не отображается в элементе управления средства просмотра отчетов. Выдает следующую ошибку.

The report server cannot process the report or shared dataset.
The shared data source 'AW' for the report server or SharePoint site is not valid.
Browse to the server or site and select a shared data source.

Источник данных — это общий источник данных, который определяется в файле rdl следующим образом.

<DataSources>
  <DataSource Name="AW">
    <DataSourceReference>AW</DataSourceReference>
  </DataSource>
</DataSources>

Если я изменю поток, т.е. сначала загружу источник данных, а затем отчет, он начнет работать! Но я на 100% уверен, что другой поток работал, когда я впервые реализовал его.

Я в тупике, почему исходный поток перестал работать. И отчет, и источник данных загружаются в определенную папку.

Может кто-нибудь пролить свет на это. Имеет ли исходный поток смысл? Я имею в виду, это должно работать, или я придумал что-то?

Кстати, загруженный источник данных имеет следующий формат

<?xml version="1.0" encoding="utf-8"?>
<DataSourceDefinition xmlns="http://schemas.microsoft.com/sqlserver/reporting/2006/03/reportdatasource">
  <Extension>SQLAZURE</Extension>
  <ConnectString>Data Source=xxx;Initial Catalog=AdventureWorks2012</ConnectString>
  <UseOriginalConnectString>false</UseOriginalConnectString>
  <OriginalConnectStringExpressionBased>false</OriginalConnectStringExpressionBased>
  <CredentialRetrieval>Store</CredentialRetrieval>
  <WindowsCredentials>false</WindowsCredentials>
  <ImpersonateUser>false</ImpersonateUser>
  <UserName>user</UserName>
  <Password>pass</Password>
  <Enabled>True</Enabled>
</DataSourceDefinition>

и я использую метод ReportingService2010.CreateCatalogItem для создания как отчета, так и источника данных.

Любая помощь высоко ценится.


person Vishal Shah    schedule 14.09.2013    source источник
comment
Я не знаю об использовании веб-службы программно, но при разработке отчетов и развертывании на сервере отчетов с помощью Visual Studio попытка развернуть отчет, когда источник данных не существует, приведет к ошибке. Не имеет особого смысла разрешать загрузку отчетов, когда зависимый источник данных не существует, иначе RS пришлось бы реализовывать логику для обновления метаданных отчета после загрузки источника данных. Возможно, раньше вы не удаляли источник данных между загрузками?   -  person Nathan Griffiths    schedule 16.09.2013
comment
Когда я загружаю отчет с помощью веб-службы, я получаю rsDataSourceReferenceNotPublished предупреждение. Повторяю, это предупреждение, а не ошибка. Так что по дизайну кажется, что это должно быть хорошо. Может быть, я пропустил шаг где-то. Но потом мне интересно, как и почему это работало раньше.   -  person Vishal Shah    schedule 16.09.2013
comment
Согласно MSDN, rsDataSourceReferenceNotPublished является некритической ошибкой. Я не могу объяснить, почему это работало раньше, но мне кажется, что для того, чтобы этот подход работал, вам нужно будет исправить ссылку на источник данных после того, как отчет будет развернут с помощью методов GetItemDataSources и SetItemDataSources.   -  person Nathan Griffiths    schedule 17.09.2013
comment
Я пробовал, но это дало мне другую ошибку. У меня сейчас нет точной ошибки, но это было что-то вроде того, что источника данных не существует. Думаю, это могло бы сработать, если бы я попытался исправить ссылку на источник данных после загрузки источника данных. Но это побеждает цель, я думаю.   -  person Vishal Shah    schedule 17.09.2013


Ответы (1)


Возможно, мой кейс может быть вам полезен. У меня была задача загружать отчеты из rdl-файлов в SSRS2012 до запуска сервера приложений. Я решил использовать API веб-сервиса, а не rs.exr. После загрузки отчета методом CreateCatalogItem класса ReportingService2010 я попытался выполнить отчеты в браузере и получил ошибку. Службе SSRS не удалось найти общий источник данных для загруженного отчета. Когда я публиковал отчеты из VS2013, отчеты работали правильно. Я не мог использовать метод SetItemDataSources , потому что не мог получить ссылку на существующий источник данных как экземпляр класса DataSource. Вот почему я нашел следующее решение. Идея в том, что rdl-файл имеет только имя общего источника данных, а не путь. Поэтому, если отчет и его источник данных находятся в разных папках, отчет не видит источник данных. В моем случае мой источник данных находится в папке «Источники данных», поэтому перед загрузкой необходимо исправить rdl-файл, как показано ниже:

Warning[] warnings = null;

string name = "ProductList";

string dsName = "DB_CORE";

string dsFolderPath = "/Data Sources";

byte[] definition = null;

// correct rdl

XmlDocument rdlDoc = new XmlDocument();

rdlDoc.Load(+ name + ".rdl");

XmlNodeList dsRefmodes = rdlDoc.GetElementsByTagName("DataSourceReference");

dsRefmodes[0].InnerText  = dsFolderPath + "/" + dsName;

definition =  Encoding.UTF8.GetBytes(rdlDoc.OuterXml);

// upload

CatalogItem report = rs.CreateCatalogItem("Report", name, "/" + parent,
                            true, definition, null, out warnings);
person Eugene Khrustalev    schedule 29.06.2016
comment
спас мне жизнь спустя 2 года! :D - person dacabdi; 15.06.2018
comment
спас мне жизнь спустя 5 лет! :D - person Jorn Vanloofsvelt; 16.03.2021