2

我正在创建一个 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>

如果我反转流程,即先上传数据源然后上传报表,它就开始工作了!但我 100% 确定,当我第一次实现它时,另一个流程曾经工作过。

我对为什么原始流程停止工作感到困惑。报表和数据源都上传到特定文件夹。

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

btw,上传的数据源格式如下

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

非常感谢任何帮助。

4

1 回答 1

1

也许,我的案例可能对你有用。我的任务是在应用程序服务器启动之前将报告从 rdl 文件上传到 SSRS2012。我决定使用 Web Service API,而不是 rs.exr。通过CreateCatalogItem 类方法加载报告后,ReportingService2010我尝试在浏览器中执行报告并出错。SSRS 找不到已加载报告的共享数据源。当我从 VS2013 发布报告时,报告工作正常。我无法使用方法SetItemDataSources,因为无法将现有数据源的引用作为 DataSource 类的实例。这就是我找到以下解决方案的原因。rdl 文件只有共享数据源的名称,而不是路径的想法。因此,如果报表及其数据源位于不同的文件夹中,则报表看不到数据源。在我的情况下,我的数据源位于文件夹“Data Sources”中,因此在上传之前需要更正 rdl-file,如下所示:

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);
于 2016-06-29T10:29:56.683 回答