2

編集:この質問を少し単純化して、知る必要があることだけを尋ねることができると思います:

SSRS 2010 Web サービスを使用して C# を使用しています: 'ReportService2010.asmx' http://technet.microsoft.com/en-us/library/ee640743.aspx

「CreateDataSource」メソッドを使用して、SSRS サーバー http:// (サーバー名)/ReportServer のインスタンスにデータソースを作成できます。

「CreateCatalogItem」メソッドを使用して、プロジェクトの RDL ローカル ファイルを参照してサーバー上にレポートを作成し、それをバイト配列にシリアル化し、それを「定義」としてメソッドに渡してサーバー上に作成することもできます。

今、私が行うことはすべて、警告と主要な警告があります。すべてを同じフォルダーにしか展開できません。「Data Sources」フォルダーと表示するデータ ソースを展開し、次に「Test Reports」と表示するレポートを展開すると、レポートは別の場所に参照する共有データ ソースがあることを認識しません。だから私はテクネットの記事を少し掘り下げて、「GetItemDataSources」メソッドを試みましたが、ReportingService2010.DataSource の戻り値の型の名前と型しか与えません。 「Report」または「DataSource」の「Dataset's 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

ひょっとしたら、これが何かの助けになるかもしれません。特定の親フォルダー内のすべてのレポートの DataSource をリセットするために使用しました。これはサブフォルダーです。

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 に答える