2013-04-03 76 views
2

编辑SSRS 2012部署的DataSet参考:我想我可以简化这个问题有点要求是需要只知道什么:更新数据源,并从C#

我与C#中使用的SSRS 2010网站工作服务: 'ReportService2010.asmx'http://technet.microsoft.com/en-us/library/ee640743.aspx

我可以使用方法'CreateDataSource'在SSRS服务器http://(servername)/ ReportServer的实例上创建数据源。

我还可以使用方法'CreateCatalogItem'在服务器上创建一个引用项目的RDL本地文件的报告,将其序列化为一个字节数组,然后将其作为'Definition'传递给在其上创建它的方法服务器。

现在我所做的一切与一个警告,以及一个主要的作品。我只能将所有内容部署到同一个文件夹。如果我部署数据源来说'数据源'文件夹,然后报告说:'测试报告',报告不知道它有一个共享的数据源来引用不同的位置。因此,我在technet文章中挖了一点点,并试图'GetItemDataSources'方法,但它只给出了ReportingService2010.DataSource返回类型的名称和类型。 有谁知道链接了一个“报告”或数据源“数据集的的CatalogItem财产“的方法,所以当部署指向在SSRS服务器上的不同文件夹中的参考?必须有办法做到这一点,因为我知道我可以从商业智能开发工作室进行部署,并且可以执行此操作。

回答

2

我已经部署报告文件时,类似的问题;当通过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属性时,不需要全限定名称。

+0

是的,这似乎正是我需要的,但我没有找到“CombinePath”您在声明Web服务的实例后拥有的方法。这是你使用的本地方法吗?我很好奇当你设置定义路径时,你只需要/(文件夹)/(对象)还是你需要http://(servername)/ ReportServer /(文件夹)/(对象)?这看起来像我想查看你的代码,让我测试它,看看我能否为它工作。 – djangojazz 2013-04-04 15:58:23

+0

我已经添加了一些关于路径的更多信息。对不起,'CombinePath'只是一个在其他地方定义的私有方法;应该对复制和粘贴更加小心。不幸的是,我现在无法运行代码来查看需要清理的内容,但希望它仍然足以让您走上正确的轨道。 – 2013-04-04 16:44:43

+0

谢谢我必须改变你的代码部分,但它的工作原理,我不能声明一个新的DataSource []并让它工作出于某种原因,奇怪。但是这个方法很有效,所以我给你答案。如果您发现数据源的“名称”不必与服务器上的rds文件的“实际名称”相匹配,我对您的编码感到好奇。 EG:如果某人懒惰,它会将其称为“DataSource1”,但可能会引用“Data Sources/TestSource”。看来GetItemDataSources的方法给你的名字,但不是参考。有任何想法吗? – djangojazz 2013-04-04 18:26:13

0

也许这可能是一些帮助。我用它来重新设置数据源在给定的父文件夹的所有报告,它的子文件夹:

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()); 
    } 
} 

}