レポートサーバーのWebサービスを使用してコードでレポートサーバーソリューションを展開しようとしています: http:// _ Server_Name_/ReportServer/ReportService2010.asmx?wsdl 。
残念ながら、オンラインで例を見つけることができません。 [〜#〜] msdn [〜#〜] からのあいまいな情報のみ。
business Intelligence Development Studioを介して公開する場合、共有データソースを公開してから、レポートを公開します。私はC#で似たようなことをしようとしています:
var service = new ReportingService2010();
service.Credentials = new NetworkCredential(username, password, domain);
foreach(var dataSourcePath in GetDataSources()) {
string name = Path.GetFileNameWithoutExtension(dataSourcePath);
Byte[] content = GetFileContent(dataSourcePath);
service.CreateCatalogItem("DataSource", name, parent, true, content, null, out warnings);
}
しかし、CreateCatalogItemは私に次のSoapException例外を与えます:
入力XMLがスキーマに準拠していません。 XML文法は、APIドキュメントで説明されています。レポートのXMLについては、レポート定義言語の構文を参照してください。 ---> Microsoft.ReportingServices.Diagnostics.Utilities.InvalidXmlException:入力XMLがスキーマに準拠していません。 XML文法は、APIドキュメントで説明されています。レポートのXMLについては、レポート定義言語の構文を参照してください。
私が間違っていることや他のアプローチを取るべきものはありますか?
私も同じ問題を抱えていました。私が見つけた解決策は次のとおりです。間違ったデータソースファイル形式を使用しています-次のように:
<?xml version="1.0" encoding="utf-8"?>
<RptDataSource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="DataSourceXML">
<ConnectionProperties>
<Extension>XML</Extension>
<ConnectString>http://server/_vti_bin/lists.asmx</ConnectString>
<IntegratedSecurity>true</IntegratedSecurity>
</ConnectionProperties>
<DataSourceID></DataSourceID>
</RptDataSource>
正しいものは次のとおりです。
<?xml version="1.0" encoding="utf-8"?>
<DataSourceDefinition xmlns="http://schemas.Microsoft.com/sqlserver/reporting/2006/03/reportdatasource">
<Extension>XML</Extension>
<ConnectString>http://server/_vti_bin/lists.asmx</ConnectString>
<CredentialRetrieval>Prompt</CredentialRetrieval>
<WindowsCredentials>True</WindowsCredentials>
<Prompt></Prompt>
<Enabled>True</Enabled>
</DataSourceDefinition>
この定義は、レポートサーバーからデータソースをダウンロードすることで取得できます。
これは、レポートサーバーから各アイテムのXMLを取得する方法です。ある意味で、レポートサーバーから「データソース」を含むオブジェクトのXML定義を「ダウンロード」する方法です(レポートサーバーデータベースがReportServerであると想定)。
select *, CONVERT(varchar(max),Content) as ContentText
from
(
SELECT
ItemID,Name,[Type],TypeDescription
, CASE
WHEN LEFT(Content,3) = 0xEFBBBF
THEN CONVERT(varbinary(max),SUBSTRING(Content,4,LEN(Content)))
ELSE
Content
END AS Content
from
(
SELECT
ItemID,Name,[Type]
, CASE Type
WHEN 2 THEN 'Report'
WHEN 5 THEN 'Data Source'
WHEN 7 THEN 'Report Part'
WHEN 8 THEN 'Shared Dataset'
ELSE 'Other'
END AS TypeDescription
, CONVERT(varbinary(max),Content) AS Content
FROM ReportServer.dbo.Catalog
WHERE Type IN (2,5,8)
) as ItemContentBinaries
) as ItemContentNoBOM
SQLデータソースの場合、これは次の定義です。
<?xml version="1.0" encoding="utf-8"?>
<DataSourceDefinition xmlns="http://schemas.Microsoft.com/sqlserver/reporting/2006/03/reportdatasource">
<Extension>SQL</Extension>
<ConnectString>Data Source=MyDatabaseServer;Initial Catalog=MyDatabase</ConnectString>
<CredentialRetrieval>Integrated</CredentialRetrieval>
<Enabled>True</Enabled>
</DataSourceDefinition>
覚えておくべきことの1つは、.rdsファイルを変更して、レポートIDEと自動展開の両方で機能させる方法が見つからなかったことです。rptprojを使用しています。 Visual Studio 2008(Visual Studio2010はSqlServer 2008 R2 Reporting Serverプロジェクトでは機能しません)。VisualStudio2008では、DataSourceファイル(* .rdsファイル)が古いスキーマ形式である必要があります。 rs.exeおよびCreateCatalogItemでは機能しません。
.rdsファイルをCreateCatalogItemで機能する形式に変換すると、.rptprojを開こうとすると、Sql Server 2008 R2 ReportingServerプロジェクトで次のエラーが発生します。
Microsoft SQL Serverレポートデザイナレポート定義を読み込めませんでした:XMLドキュメント(2、2)にエラーがあります。レポート定義が正しいスキーマに準拠していることを確認してください。 XMLドキュメント(2、2)にエラーがあります。 (System.Xml)
<DataSourceDefinition xmlns='http://schemas.Microsoft.com/sqlserver/reporting/2006/03/reportdatasource'> was not expected. (wp6bqrt3)
カタログからデータソースを実際に追加しようとしたことはありませんが、確実に機能する方法は知っています。公開するレポートで参照されているデータソースと同じ名前のデータソースを作成するだけです。これは、ReportingService2010を使用したMSDNの例です。
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
class Sample
{
static void Main(string[] args)
{
ReportingService2010 rs = new ReportingService2010();
rs.Url = "http://<Server Name>" +
"/_vti_bin/ReportServer/ReportService2010.asmx";
rs.Credentials =
System.Net.CredentialCache.DefaultCredentials;
string name = "AdventureWorks.rsds";
string parent = "http://<Server Name>/Docs/Documents/";
// Define the data source definition.
DataSourceDefinition definition = new DataSourceDefinition();
definition.CredentialRetrieval =
CredentialRetrievalEnum.Integrated;
definition.ConnectString =
"data source=(local);initial catalog=AdventureWorks";
definition.Enabled = true;
definition.EnabledSpecified = true;
definition.Extension = "SQL";
definition.ImpersonateUserSpecified = false;
//Use the default Prompt string.
definition.Prompt = null;
definition.WindowsCredentials = false;
try
{
rs.CreateDataSource(name, parent, false,
definition, null);
}
catch (SoapException e)
{
Console.WriteLine(e.Detail.InnerXml.ToString());
}
}
}
レポートを公開してデータソースを作成するためのコードは次のとおりです。Reportingservice2010用に作成されていませんが、2010に移行するのは難しいことではありません。
Byte[] definition = null;
Warning[] warnings = null;
string parentFolder = "AdventureWorks Sample Reports";
string parentPath = "/" + parentFolder;
string filePath = "D:\\Program Files\\Microsoft SQL Server\\100\\Samples\\Reporting Services\\Report Samples\\AdventureWorks Sample Reports\\";
public void Main()
{
rs.Credentials = System.Net.CredentialCache.DefaultCredentials;
//Create the parent folder
try {
rs.CreateFolder(parentFolder, "/", null);
Console.WriteLine("Parent folder {0} created successfully", parentFolder);
} catch (Exception e) {
Console.WriteLine(e.Message);
}
//Publish the sample reports
PublishReport("EmbeddedDatasource");
}
public void PublishReport(string reportName)
{
try {
FileStream stream = File.OpenRead(filePath + reportName + ".rdl");
definition = new Byte[stream.Length + 1];
stream.Read(definition, 0, Convert.ToInt32(stream.Length));
stream.Close();
} catch (IOException e) {
Console.WriteLine(e.Message);
}
try {
warnings = rs.CreateReport(reportName, parentPath, false, definition, null);
if ((warnings != null)) {
Warning warning = default(Warning);
foreach ( warning in warnings) {
Console.WriteLine(warning.Message);
}
} else {
Console.WriteLine("Report: {0} published successfully with no warnings", reportName);
}
} catch (Exception e) {
Console.WriteLine(e.Message);
}
try {
DataSourceDefinition definition = new DataSourceDefinition();
definition.CredentialRetrieval = CredentialRetrievalEnum.Store;
DataSourceReference reference = new DataSourceReference();
definition.ConnectString = "Data Source=.;Initial Catalog=AdventureWorks";
definition.UserName = "username";
definition.Password = "password";
definition.Extension = "SQL";
definition.WindowsCredentials = true;
DataSource[] sources = new DataSource[1];
DataSource s = new DataSource();
s.Item = definition;
s.Name = "DataSource1";
sources(0) = s;
rs.SetItemDataSources("/AdventureWorks Sample Reports/EmbeddedDatasource", sources);
} catch (Exception exp) {
Console.WriteLine(exp.Message);
}
}
CreateCatalogItemの msdnドキュメント が誤解を招く可能性があることを発見しました。
Webサービスを使用して(Sharepointではなく)ネイティブモードで新しいレポートを展開しようとしましたが、Parentパラメーターのガイダンスに従うとエラーが発生しました。
親
タイプ:System.String
アイテムを含む親フォルダーの完全修飾URL。
このページのコード例はこれを示しています:
string parent = "http://<Server Name>/Docs/Documents/";
だから私はこのフォーマットを使ってみました:
string parent = "http://<Server Name>/<FolderPath>/";
次のエラーが発生しました:
Microsoft.ReportingServices.Diagnostics.Utilities.InvalidItemPathException:
The path of the item 'http://<Server Name>/<FolderPath>/' is not valid.
The full path must be less than 260 characters long; other restrictions apply.
If the report server is in native mode, the path must start with slash.
それから私はコメントでこれに気づきました(最後にスラッシュがある例と矛盾します):
Parentパラメーターは、nullまたは空にすることはできません。また、次の予約文字を含めることはできません。 ; @&= + $、\ *> <| 。 "。スラッシュ文字(/)を使用して、フォルダーのフルパス名の項目を区切ることはできますが、フォルダー名の末尾に使用することはできません。
試行錯誤の末、親パスをフォルダーパスのみに設定し、先頭にスラッシュを付けて、最終的にレポートを展開することができました。
string parent = "/<FolderPath>";
いくつかのガイダンスを提供したかっただけです。 1年ほど前にReportingServiceサービスでいくつかの問題が発生し、オンラインでもほとんど情報が見つからなかったので、そこから学んだことをここに投稿しました。これがお役に立てば幸いです。
http://www.ericwitkowski.com/2013/05/an-introduction-to-querying-and.html