编辑:我想我可以把这个问题简化一下,只问需要知道的东西:
我正在使用c#使用SSRS 2010 Web Service:"ReportService2010。asmx的http://technet.microsoft.com/en-us/library/ee640743.aspx
我可以使用'CreateDataSource'方法在SSRS服务器(http://(servername)/ReportServer)的实例上创建数据源。
我也可以使用'CreateCatalogItem'方法在服务器上创建一个报告,从引用项目的RDL本地文件将其序列化为字节数组,然后将其作为'Definition'传递给在服务器上创建它的方法。
现在我做的每件事都有一个警告,一个主要的警告。我只能将所有内容部署到同一个文件夹。如果我部署一个数据源说"数据源"文件夹,然后一个报告说:"测试报告",报告不知道它有一个共享的数据源在不同的位置引用。因此,我在技术文章中挖掘了一点,并尝试了"GetItemDataSources"方法,但它只提供了ReportingService2010的名称和类型。数据源返回类型。有没有人知道链接'报告'或'数据源'的'数据集的CatalogItem属性的方法,因此它指向部署时在SSRS服务器上的不同文件夹中的引用?必须有一种方法来做到这一点,因为我知道我可以从商业智能开发工作室部署,它可以做到这一点
我在部署报告文件时遇到过类似的问题;当通过rs.exe或代码部署时,您会遇到这些问题,报告会丢失到数据源的链接。
我们通过在应用程序部署后立即显式地将报告指向服务器端数据源来解决这个问题;这和你想做的事情相似吗?
无论如何,下面是我们在报告部署应用程序中使用的稍微修改过的代码:static void SetReportDataSource(string reportPath)
{
string dsPath = CombinePath(DataSourcePath, DataSourceFolder, DataSourceName);
DataSourceReference dsRef = new DataSourceReference()
{
Reference = dsPath
};
DataSource ds = new DataSource();
ds.Item = dsRef as DataSourceDefinitionOrReference;
ds.Name = DataSourceName;
var rptDataSources = Server.GetItemDataSources(reportPath);
foreach (var rptDs in rptDataSources)
{
Server.SetItemDataSources(filePath, new DataSource[] { ds });
}
}
因此,基本上我们有变量来定义诸如数据源名称、数据源在服务器上的位置等信息,对于报表也是如此。它们可以放在不同的文件夹。
在此基础上,我们创建一个对数据源的新引用,然后使用SetItemDataSources
将报告重新指向该数据源。
无论如何,这为我整理了数据源问题。不确定共享数据集以及他们如何处理所有这些,但希望这将是一些帮助。
同样,只是认为这将使用ReportService2005
端点,但ReportService2010
可能没有太大不同。
对于这里提到的路径,它们是相对于服务器的,例如/Reports/
。当您定义包含目标的ReportService2010
对象的Url
属性时,不需要完全限定名。
也许这可能会有所帮助。我用它重置了给定父文件夹中所有报告的数据源,以及它的子文件夹:
using System;
using GetPropertiesSample.ReportService2010;
using System.Diagnostics;
using System.Collections.Generic; //<== required for LISTS
using System.Reflection;
namespace GetPropertiesSample
{
class Program
{
static void Main(string[] args)
{
GetListOfObjectsInGivenFolder_and_ResetTheReportDataSource("0_Contacts"); //<=== This is the parent folder
}
private static void GetListOfObjectsInGivenFolder_and_ResetTheReportDataSource(string sParentFolder)
{
// Create a Web service proxy object and set credentials
ReportingService2010 rs = new ReportingService2010();
rs.Credentials = System.Net.CredentialCache.DefaultCredentials;
CatalogItem[] reportList = rs.ListChildren(@"/" + sParentFolder, true);
int iCounter = 0;
foreach (CatalogItem item in reportList)
{
iCounter += 1;
Debug.Print(iCounter.ToString() + "]#########################################");
if (item.TypeName == "Report")
{
Debug.Print("Report: " + item.Name);
ResetTheDataSource_for_a_Report(item.Path, "/DataSources/Shared_New"); //<=== This is the DataSource that I want them to use
}
}
}
private static void ResetTheDataSource_for_a_Report(string sPathAndFileNameOfTheReport, string sPathAndFileNameForDataSource)
{
//from: http://stackoverflow.com/questions/13144604/ssrs-reportingservice2010-change-embedded-datasource-to-shared-datasource
ReportingService2010 rs = new ReportingService2010();
rs.Credentials = System.Net.CredentialCache.DefaultCredentials;
string reportPathAndName = sPathAndFileNameOfTheReport;
//example of sPathAndFileNameOfTheReport "/0_Contacts/207_Practices_County_CareManager_Role_ContactInfo";
List<ReportService2010.ItemReference> itemRefs = new List<ReportService2010.ItemReference>();
ReportService2010.DataSource[] itemDataSources = rs.GetItemDataSources(reportPathAndName);
foreach (ReportService2010.DataSource itemDataSource in itemDataSources)
{
ReportService2010.ItemReference itemRef = new ReportService2010.ItemReference();
itemRef.Name = itemDataSource.Name;
//example of DataSource i.e. 'itemRef.Reference': "/DataSources/SharedDataSource_DB2_CRM";
itemRef.Reference = sPathAndFileNameForDataSource;
itemRefs.Add(itemRef);
}
rs.SetItemReferences(reportPathAndName, itemRefs.ToArray());
}
}
}