Проблемы 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 выглядит так (разумеется, в основном):

    <Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner">
      <Body>
        <ReportItems>
          <Tablix Name="Tablix1">
            <DataSetName>XmlDataSet_TopCustomers</DataSetName>
          </Tablix>
          <Chart Name="Chart1">
            <DataSetName>XmlDataSet_TopCustomers</DataSetName>
          </Chart>
        </ReportItems>
      </Body>
      <DataSources>
        <DataSource Name="XmlDataSource_TopCustomers">
          <ConnectionProperties>
            <DataProvider>XML</DataProvider>
            <ConnectString />
          </ConnectionProperties>
          <rd:SecurityType>None</rd:SecurityType>
          <rd:DataSourceID>47833b52-231f-4634-8af4-3c63272b02a7</rd:DataSourceID>
        </DataSource>
      </DataSources>
      <DataSets>
        <DataSet Name="XmlDataSet_TopCustomers">
          <Query>
            <DataSourceName>XmlDataSource_TopCustomers</DataSourceName>
            <CommandText><Query>
     <ElementPath>Root /CustomerOrder {@CustomerNo, @CustomerName, @OrdersCount (Integer), @Total(Float), @AveragePerOrder(Float)}</ElementPath>
     <XmlData>
      <Root>
    <CustomerOrder CustomerNo="10001" CustomerName="Name 1" OrdersCount="2" Total="5.446740000000000e+003" AveragePerOrder="2.723370000000000e+003" />
    <CustomerOrder CustomerNo="10894" CustomerName="Name 2" OrdersCount="5" Total="3.334750000000000e+003" AveragePerOrder="6.669500000000001e+002" />
    <CustomerOrder CustomerNo="12980" CustomerName="Name 3" OrdersCount="2" Total="2.003290000000000e+003" AveragePerOrder="1.001645000000000e+003" />
      </Root>
     </XmlData>
    </Query></CommandText>
            <rd:UseGenericDesigner>true</rd:UseGenericDesigner>
          </Query>
          <Fields>...
        
      </DataSets>
      <rd:ReportUnitType>Inch</rd:ReportUnitType>
      <rd:ReportID>02172db8-2a1d-4c35-9555-b37ee6193544</rd: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 выше.

Какие-либо предложения?


person Marius Bancila    schedule 23.01.2013    source источник


Ответы (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.

person Marius Bancila    schedule 24.01.2013

У меня есть небольшое приложение командной строки, которое делает что-то подобное, но между определением пути к отчету и выполнением каких-либо действий со средством просмотра отчетов я устанавливаю источник данных для отчета, который будет запускаться:

report.DataSources.Add(new ReportDataSource("DataSet_for_Distribution", table));

... таблица является DataTable.

После этого у меня нет проблем с программным вызовом метода Report Render.

Можете ли вы установить паузу перед рендерингом и посмотреть, какие источники данных на самом деле есть в отчете?

Еще одна вещь, которую стоит попробовать, и может быть, вы просто отформатировали (или отформатировали стек) его, чтобы опубликовать его здесь, но когда я встраиваю набор данных XML в отчет, он все использует такой формат:

<CommandText>&lt;Query&gt;
    &lt;ElementPath&gt;Root /S  {@OrderDate (Date), @TotalDue (Decimal)} /C {@LastName} &lt;/ElementPath&gt;
    &lt;XmlData&gt;
    &lt;Root&gt;
    &lt;S OrderDate="2003-07-01T00:00:00" SalesOrderNumber="SO51131" TotalDue="247913.9138"&gt;
      &lt;C FirstName="Shu" LastName="Ito" /&gt;
    &lt;/S&gt;
    &lt;S OrderDate="2003-10-01T00:00:00" SalesOrderNumber="SO55282" TotalDue="227737.7215"&gt;
      &lt;C FirstName="Shu" LastName="Ito" /&gt;
    &lt;/S&gt;
    &lt;S OrderDate="2002-07-01T00:00:00" SalesOrderNumber="SO46616" TotalDue="207058.3754"&gt;
      &lt;C FirstName="Jae" LastName="Pak" /&gt;
    &lt;/S&gt;
    &lt;S OrderDate="2002-08-01T00:00:00" SalesOrderNumber="SO46981" TotalDue="201490.4144"&gt;
      &lt;C FirstName="Ranjit" LastName="Varkey Chudukatil" /&gt;
    &lt;/S&gt;
    &lt;S OrderDate="2002-09-01T00:00:00" SalesOrderNumber="SO47395" TotalDue="198628.3054"&gt;
      &lt;C FirstName="Michael" LastName="Blythe" /&gt;
    &lt;/S&gt;
    &lt;/Root&gt;
    &lt;/XmlData&gt;
    &lt;/Query&gt;</CommandText>
person Kevin Dahl    schedule 23.01.2013
comment
Ну да, явное добавление источника данных действительно работает, но я не ожидал этого. Я предполагаю, что когда я запускаю свой отчет с помощью IDE, отчет анализируется и источник данных, подобный этому, создается во время выполнения, прежде чем отчет будет отображен. Тем не менее, в данном случае я не вижу смысла встраивать XML, если мне все еще нужно явно предоставлять его. И, кстати, то же самое происходит, если я использую источник данных SQL. - person Marius Bancila; 24.01.2013
comment
Ах, насчет форматирования, вы правы; браузер отображает &lt; как ‹в тексте, заключенном в теги pre, что разрушает сам код. - person Marius Bancila; 24.01.2013
comment
@Marius - В этом другом сообщении стека здесь есть полезная информация относительно RDL / RDLC: stackoverflow.com/questions/1079162/ - person Kevin Dahl; 24.01.2013
comment
Спасибо, Кевин. Это точный ответ, который я нашел в нескольких местах. В: Каковы ограничения элемента управления ReportViewer? О: В отличие от сервера отчетов элемент управления ReportViewer не подключается к базам данных и не выполняет запросы. Кроме того, в локальном режиме доступны только форматы экспорта: Excel, Word и PDF. (В удаленном режиме доступны все форматы, поддерживаемые сервером отчетов.) Элемент управления ReportViewer не может быть расширен путем добавления настраиваемых средств визуализации или настраиваемых элементов отчета. gotreportviewer.com - person Marius Bancila; 24.01.2013

Я не уверен, что из того, что вы указали, указаны ли учетные данные в источнике данных.

Эта часть здесь:

<ConnectionProperties>
            <DataProvider>XML</DataProvider>
            <ConnectString />
          </ConnectionProperties>

Вообще говоря, с источниками данных SQL, когда отчеты не отображаются для других или из приложений, это происходит из-за того, что хост-сервер принимает учетные данные, отличные от вашей IDE, создающей приложение. Он не знает, зовут ли меня Бретт, что мои учетные данные используют его при удаленном вызове. Когда вы указываете учетные данные на сервере, на котором размещен отчет, вы обычно можете обойти это. Вы заходите на сервер, на котором размещен отчет, я предполагаю, что вы делаете это, поскольку у вас есть отчет «rdl», а не отчет rdlc. Найдите источник данных, щелкните «Свойства», измените настройку на «использовать эти учетные данные». Предоставьте удостоверения, которые, как вы знаете, работают.

Это может решить проблему. Я не уверен в соединениях Sharepoint и XML, но это обычное дело при просмотре проблем с соединениями SQL Server.

person djangojazz    schedule 23.01.2013
comment
Я не думаю, что это имеет какое-то отношение к полномочиям. Конечно, в этом случае я бы ожидал другого исключения. Или, может быть, я просто возлагаю большие надежды. - person Marius Bancila; 24.01.2013
comment
Это была просто мысль. Возможно, если вы размещаете код на сервере, который использует учетную запись доступа, отличную от вашей, он может использовать эту учетную запись для доступа к файлу. Когда вы указываете аккаунт, он знает. Однако с XML и списками я не уверен, как SSRS обрабатывает эти строки подключения, я знаю только, что у меня были проблемы с учетными записями и доступом с помощью строк подключения SQL. - person djangojazz; 24.01.2013
comment
Нет, видите ли, у меня нет внешних данных. Я ничего не размещаю на сервере. Я встроил единственное, что хочу отобразить, в сам файл RDL. Однако ReportViewer, кажется, просто игнорирует это и требует явных экземпляров набора данных. - person Marius Bancila; 24.01.2013
comment
Интересно, можете ли вы еще встроить учетные данные? Я всегда думал, что отчет по умолчанию - это rdlc в приложении C #, то есть клиент языка определения отчетов. По сравнению с RDL, который обычно разрабатывается в Business Intelligence Development Studio, добавляется к Visual Studio, а затем развертывается на сайте. Была ли причина не развертывать отчет и не ссылаться на него через веб-службу, но по-прежнему использовать формат RDL? Вообще говоря, я обычно создаю отчеты, которые должны быть самодостаточными в C #, прямо из панели инструментов как «отчет», и он создает и файл rdlc. - person djangojazz; 24.01.2013
comment
Думаю, я получил здесь свой ответ forum.asp.net/t/1173578.aspx/1: элемент управления ReportViewer не содержит никакой логики для подключения к базам данных или выполнения запросов. За счет выделения такой логики ReportViewer стал совместимым со всеми источниками данных, включая источники данных, не относящиеся к базе данных. Однако это означает, что когда файл RDL используется элементом управления ReportViewer, связанная с SQL информация в файле RDL просто игнорируется элементом управления. Основное приложение отвечает за подключение к базам данных, выполнение запросов и предоставление данных элементу управления ReportViewer ... - person Marius Bancila; 24.01.2013
comment
Я бы посоветовал попробовать RDLC, если вам нужно, чтобы он был клиентским (автономным в приложении), и если вам нужно использовать отчет RDL, разверните его на сервере, установите настройку источника данных на хост-сервере, назовите это отчет из объекта средства просмотра отчетов в коде. - person djangojazz; 24.01.2013