4

我在一台服务器上安装了带有 SSRS 的 SQL Server 2008,在新服务器上安装了带有 SSRS 的 SQL Server 2008 R2。我想使用 SSRS Web 服务 API 将 200 多个报告以及一些共享计划和几个数据源从第一台服务器迁移到第二台服务器。为简单起见,因为只有几个共享数据源,我继续使用 Report Manager 界面创建了这些数据源。

不幸的是,在我之前的人在每个报告中都嵌入了数据源信息(连接字符串、登录名、密码等)。我认为这是将这些更改为指向共享数据源的好时机,这样就不必为每个报告一个一个地执行此操作。我可以使用 CreateCatalogItem 在新服务器上创建报告,但我似乎无法确定如何正确地从嵌入式数据源更改为共享数据源。

到目前为止,我已经尝试了两个 SetItemReferences:

itemRef.Reference = "/Data Sources/TMS";
itemRef.Name = "TMS";
itemRef.Reference = "/Data Sources/TMS";

rs2010.SetItemReferences(catItem.Path, new ReportService2010.ItemReference[] { itemRef });

和 SetItemDataSources:

ReportService2010.DataSourceReference dataSourceRef = new ReportService2010.DataSourceReference();
dataSourceRef.Reference = "/Data Sources/TMS";

ReportService2010.DataSource dataSource = new ReportService2010.DataSource();
dataSource.Name = "TMS";
dataSource.Item = dataSourceRef;

rs2010.SetItemDataSources(catItem.Path, new ReportService2010.DataSource[] { dataSource });

这两种方法在尝试使用嵌入数据源的报表时都会导致“NotFoundException”,但它们都可以在已经指向共享数据源的报表上正常工作。

此外,我在 Google 和 StackOverflow 上都搜索了解决方案,但一无所获。谁能在这里指出我正确的方向?

4

1 回答 1

5

所以我一直在使用 SetItemReferences 方法,并有一个绝妙的想法最终奏效了。我使用的最终代码如下:

List<ReportService2010.ItemReference> itemRefs = new List<ReportService2010.ItemReference>();
ReportService2010.DataSource[] itemDataSources = rs2010.GetItemDataSources(catItem.Path);

foreach (ReportService2010.DataSource itemDataSource in itemDataSources)
{
    ReportService2010.ItemReference itemRef = new ReportService2010.ItemReference();
    itemRef.Name = itemDataSource.Name;
    itemRef.Reference = "/Data Sources/TMS";
    itemRefs.Add(itemRef);
}

rs2010.SetItemReferences(catItem.Path, itemRefs.ToArray());

问题是我使用的数据源名称与报告 .rdl 文件中的名称不同。我能够使用 GetItemDataSources 方法确定名称应该是什么。由于此方法返回一个数组并且在所述数组中可能有多个项目,因此如果存在多个 ItemReference,我会遍历它以创建多个 ItemReference,尽管我怀疑这种情况是否经常发生。

于 2012-10-31T15:09:57.227 回答