s-s-rS - 报告后上传数据源
Posted
技术标签:
【中文标题】s-s-rS - 报告后上传数据源【英文标题】:s-s-rS - Upload Data Source after Report 【发布时间】:2013-09-14 05:29:45 【问题描述】:我正在创建一个 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% 确定,当我第一次实现它时,另一个流程曾经工作过。
我对为什么原来的流程停止工作感到困惑。 报表和数据源都上传到特定文件夹。
有人可以解释一下吗? 原来的流程有意义吗?我的意思是它应该起作用,还是我在想象?
顺便说一句,上传的数据源格式如下
<?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
方法来创建报告和数据源。
非常感谢任何帮助。
【问题讨论】:
我不知道以编程方式使用 Web 服务,但是在使用 Visual Studio 设计报表并部署到报表服务器时,尝试在数据源不存在时部署报表会导致错误。当依赖的数据源不存在时,允许上传报表没有多大意义,否则 RS 必须在您上传数据源后实现更新报表元数据的逻辑。也许以前您没有在上传之间删除数据源? 当我使用网络服务上传报告时,我收到rsDataSourceReferenceNotPublished
警告。我再说一遍,它是一个警告,而不是一个错误。所以按照设计,这似乎应该没问题。也许我在某个地方错过了一步。但后来我想知道它以前是如何以及为什么工作的。
根据 MSDN rsDataSourceReferenceNotPublished 是一个非关键错误。我无法解释为什么这以前似乎有效,但在我看来,要使这种方法有效,您需要在使用 GetItemDataSources 和 SetItemDataSources 方法部署报告后修复数据源引用。
我试过了,但它给了我一个不同的错误。我现在没有确切的错误,但这是数据源不存在的问题。我想如果我尝试在上传数据源之后修复数据源引用,它可能会起作用。但这违背了我猜想的目的。
【参考方案1】:
也许,我的案例可能对你有用。我的任务是在应用程序服务器启动之前将报告从 rdl 文件上传到 s-s-rS2012。我决定使用 Web Service API,而不是 rs.exr。
通过 ReportingService2010
类的方法 CreateCatalogItem
加载报告后,我尝试在浏览器中执行报告并出现错误。 s-s-rS 找不到已加载报告的共享数据源。当我从 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);
【讨论】:
两年后救了我的命! :D 五年后救了我的命! :D以上是关于s-s-rS - 报告后上传数据源的主要内容,如果未能解决你的问题,请参考以下文章
s-s-rS 上传 14Mb 报告不起作用(超出最大请求长度。)