2

编辑:我想我可以稍微简化一下这个问题,只询问需要知道的内容:

我正在使用 SSRS 2010 Web 服务使用 C#:'ReportService2010.asmx' http://technet.microsoft.com/en-us/library/ee640743.aspx

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

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

现在,我所做的一切都带有一个警告,一个主要的。我只能将所有内容部署到同一个文件夹。如果我部署一个数据源来表示“数据源”文件夹,然后部署一个报告说:“测试报告”,则报告不知道它有一个共享数据源可以在不同的位置引用。所以我在technet文章中挖掘了一点,并尝试了“GetItemDataSources”方法,但它只给出了 ReportingService2010.DataSource 返回类型的名称和类型。 有谁知道链接“数据源”的“报告”或“数据集的 CatalogItem 属性”的方法,所以它在部署时指向SSRS服务器上不同文件夹中的引用? 必须有一种方法可以做到这一点,因为我知道我可以从 Business Intelligence Development Studio 进行部署并且它可以做到这一点。

4

2 回答 2

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/. 在定义包含目标Url的对象的属性时,您不需要完全限定名称。ReportService2010

于 2013-04-04T15:21:23.847 回答
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());
    }
}

}

于 2016-03-27T17:02:37.347 回答