SSRS - 报告后上传数据源

问题描述 投票:0回答:2

我正在创建一个 MVC 应用程序,它使用报告 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
方法来创建报告和数据源。

非常感谢任何帮助。

reporting-services ssrs-2008 report-viewer2010 rdl
2个回答
2
投票

也许我的案例对你有用。我的任务是在应用程序服务器启动之前将报告从 rdl 文件上传到 SSRS2012。我决定使用 Web 服务 API,而不是 rs.exr。 通过类

CreateCatalogItem
的方法
ReportingService2010
加载报告后,我尝试在浏览器中执行报告并收到错误。 SSRS 找不到加载的报告的共享数据源。当我从 VS2013 发布报告时,报告工作正常。我无法使用方法
SetItemDataSources
,因为无法获取对现有数据源的引用作为 DataSource 类的实例。这就是为什么我找到了以下解决方案。 rdl 文件的想法是只有共享数据源的名称,而不是路径。因此,如果报表及其数据源位于不同的文件夹中,则报表看不到数据源。就我而言,我的数据源位于“Data Sources”文件夹中,因此在上传之前需要更正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);

0
投票

您还可以对报告服务数据库使用 SQL 查询来更正错误

--要批量更新 SSRS 报告的数据源,请运行此脚本

--使用报告服务器

--更新一份报告,然后运行该报告并复制 DS.Link

   SELECT C.Name, C.path, ds.name, ds.Link

来自数据源 AS ds 将目录加入为 c ON c.ItemID = ds.ItemID WHERE ds.NAME = 'HALoCOREDB' AND c.path LIKE '%/Reports/%' AND ds.Link IS NOT NULL

--更新报告的数据源

开始传输

更新 dSource 设置 [标志] = [标志] | 2、[链接] = '53EFEDAE-3485-450A-AE4D-93AF1E0C4684' FROM 数据源 AS dSource 将目录加入为 cLog ON cLog.ItemID = dSource.ItemID WHERE dSource.flags = dSource.flags AND dSource.Link IS NULL AND dSource.ConnectionString IS NULL AND dSource.NAME <> 'HALoCOREDB' AND cLog.path LIKE '%/Reports/%'

--验证交易

   SELECT C.Name, C.path, ds.name, ds.Link

来自数据源 AS ds 将目录加入为 c ON c.ItemID = ds.ItemID WHERE ds.NAME = 'HALoCOREDB' AND c.path LIKE '%/Reports/%' AND ds.Link IS NOT NULL

--验证后提交交易

提交事务

© www.soinside.com 2019 - 2024. All rights reserved.