SSRS - 报告后上传数据源

时间:2013-09-14 05:29:45

标签: reporting-services ssrs-2008 report-viewer2010 rdl

我正在创建一个MVC应用程序,它使用Reporting Web服务(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>

如果我反向流程,即先上传数据源然后再上传报告,它就会开始工作! 但我百分百肯定,当我第一次实施它时,其他流程已经开始工作了。

我很难过为什么原始流程已停止工作。 报告和数据源都上传到特定文件夹。

有人可以对此有所了解。 原始流程是否有意义?我的意思是它应该工作,还是我想象的东西?

顺便说一下,上传的数据源采用以下格式

<?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方法创建报告和数据源。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

也许,我的情况可能对你有用。我有一项任务是在应用程序服务器启动之前将报告从rdl文件上传到SSRS2012。我决定使用Web Service 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);