我在一台服务器上安装了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”,但它们在已指向共享数据源的报表上都能正常工作。
此外,我搜索了整个谷歌以及StackOverflow的解决方案,但一无所获。谁能指出我在这方面的正确方向?
答案 0 :(得分:4)
所以我继续使用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文件中找到的相同的DataSource名称。我能够使用GetItemDataSources方法确定名称应该是什么。由于此方法返回一个数组,并且在所述数组中可能有多个项目,因此我循环创建多个ItemReferences,如果存在多个ItemReferences,但我怀疑这种情况经常发生,如果有的话。