SSRS ReportViewer XML嵌入式数据源的问题

时间:2013-01-23 12:23:39

标签: sql-server xml reporting-services rdl

我有C#(WPF)应用程序,我想在ReportViewer控件中显示SSRS报告。本地报告文件中嵌入了XML数据源。从SQL Server Business Intelligence Development Studio运行时,报告正确显示。但是当我使用我的应用程序运行时,我收到以下错误:

A data source instance has not been supplied for the data source '...'.

所以这就是我正在做的事情:

我已经定义了嵌入式XML数据,如本教程Defining a Report Dataset from Embedded XML Data中所述。我有一个名为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片段中看到的那样。

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

我的问题的答案也可以在When to use RDLC over RDL reports?http://www.gotreportviewer.com/找到。基本上就是这样:

  

与报表服务器不同,ReportViewer控件无法连接   数据库或执行查询。此外,在本地模式下唯一的出口   可用格式包括Excel,Word和PDF。 (在远程模式下所有格式   报表服务器支持。)ReportViewer   无法通过添加自定义渲染器或自定义报告来扩展控件   项目

可在此处找到更多信息http://msdn.microsoft.com/en-us/library/ms252109(v=vs.80).aspx

  

处理.rdlc文件的ReportViewer控件忽略了    RDL的元素。如果报表定义包含查询,则   控制不会处理它。

  

将.rdl文件转换为.rdlc格式时,必须手动替换   报表定义中的数据源和查询信息   您的应用程序中提供的数据结构

因此,您必须显式获取数据,并将ReportViewer作为ReportDataSource提供,其名称与RDL文件中的数据集完全相同。

答案 1 :(得分:0)

我有一个类似的小命令行应用程序,但是在定义报告路径和对报表查看器执行任何操作之间我正在为要运行的报表设置数据源:

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

... table是一个DataTable。

之后我以编程方式调用报告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>

答案 2 :(得分:0)

如果数据源已指定凭据,我不确定您所声明的内容。

这部分:

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

一般来说,当报表无法为其他人或应用程序查看报表时,SQL数据源是由于托管服务器采用与构建应用程序的IDE不同的凭据。它不知道我的名字是否是Brett,我的凭据在远程调用时运行它。在托管报告的服务器上指定凭据时,通常可以解决此问题。你进入托管报告的服务器,我假设你这样做,因为你有一个'rdl'报告而不是rdlc报告。找到数据源,单击属性,将设置更改为“使用这些凭据”。提供您知道的工作证书。

这可能会解决问题。我不确定Sharepoint连接和XML连接,但这在查看SQL Server连接问题时很常见。