Question Comment utiliser ReportingService2010?


J'essaie de déployer une solution de serveur de rapports par code en utilisant le service Web du serveur de rapports: http: //_Server_Name_/ReportServer/ReportService2010.asmx? wsdl.

Malheureusement, je ne trouve aucun exemple en ligne. Seules quelques informations vagues de MSDN.

lors de la publication via Business Intelligence Development Studio, il publie la source de données partagée, puis publie les rapports. J'essaie de quelque chose de similaire sur 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);
}

Mais le CreateCatalogItem me donne l'exception SoapException suivante:

Le XML d'entrée n'est pas conforme à la   schéma. La grammaire XML est décrite dans   la documentation de l'API. Pour XML dans   rapports, voir Définition du rapport   Syntaxe du langage --->   Microsoft.ReportingServices.Diagnostics.Utilities.InvalidXmlException:   Le XML d'entrée n'est pas conforme à la   schéma. La grammaire XML est décrite dans   la documentation de l'API. Pour XML dans   rapports, voir Définition du rapport   Syntaxe du langage

Y a-t-il quelque chose que je fais mal ou une autre approche que je devrais prendre?


17
2018-03-28 16:59


origine


Réponses:


J'ai eu le même problème. La solution que j'ai trouvée est la suivante: Vous utilisez un format de fichier DataSource incorrect - comme ceci:

 <?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> 

Le bon est:

<?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>

Vous pouvez obtenir cette définition en téléchargeant DataSource à partir de votre serveur de rapports.


11
2017-08-30 12:51



Voici un moyen d'obtenir le XML pour chaque élément du serveur de rapports, en quelque sorte un moyen de "télécharger" la définition XML de tout objet, y compris un "DataSource" du serveur de rapports (en supposant que votre base de données de serveur de rapports soit 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

Pour une source de données SQL, c'est la définition que nous avions:

<?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>

Une chose à garder à l'esprit est que nous n'avons pas pu trouver un moyen de modifier les fichiers .rds et de le faire fonctionner à la fois avec l'EDI de génération de rapports et le déploiement automatique. Nous utilisons un fichier .rptproj avec Visual Studio 2008 (Visual Studio 2010 ne peut pas fonctionner avec les projets Sql Server 2008 R2 Reporting Server). Visual Studio 2008 nécessite que les fichiers DataSource (fichiers * .rds) soient dans le vieux schéma format, qui ne fonctionnera pas avec rs.exe et CreateCatalogItem.

Si nous convertissons le fichier .rds dans un format compatible avec CreateCatalogItem, le projet Sql Server 2008 R2 Reporting Server génère l'erreur suivante lors de l'ouverture du fichier .rptproj:

Concepteur de rapports Microsoft SQL Server   Le chargement de la définition de rapport a échoué: une erreur s'est produite dans le document XML (2, 2). Vérifiez que la définition du rapport est conforme au schéma correct.   Il y a une erreur dans le document XML (2, 2). (System.Xml)

<DataSourceDefinition xmlns='http://schemas.microsoft.com/sqlserver/reporting/2006/03/reportdatasource'> was not expected. (wp6bqrt3)

5
2017-10-20 19:26



Je viens de découvrir que le documentation msdn pour CreateCatalogItem est trompeur.

J'essayais de déployer un nouveau rapport en mode natif (pas Sharepoint) en utilisant le webservice, et j'ai reçu une erreur lorsque j'ai suivi les instructions pour le paramètre Parent:

Parent

Type: System.String

L'URL complète du dossier parent qui contiendra l'élément.

L'exemple de code sur la page montre ceci:

string parent = "http://<Server Name>/Docs/Documents/";

J'ai donc essayé d'utiliser ce format:

string parent = "http://<Server Name>/<FolderPath>/";

J'ai eu l'erreur suivante:

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.

Ensuite, j'ai remarqué cela dans les remarques (en contradiction avec l'exemple qui a une barre oblique à la fin):

Le paramètre Parent ne peut pas être nul ou vide ou contenir les éléments suivants   caractères réservés:: ; @ & = + $, \ *> <| . ". Vous pouvez utiliser le   barre oblique (/) pour séparer les éléments du nom de chemin complet de   le dossier, mais vous ne pouvez pas l’utiliser à la fin du nom du dossier.

Après des essais et des erreurs, j'ai finalement pu déployer le rapport en définissant le chemin parent sur le chemin du dossier, avec une barre oblique au début:

string parent = "/<FolderPath>";

3
2017-11-30 23:14



Je n'ai jamais vraiment essayé d'ajouter un DataSource à travers le Catalogue, mais je sais comment cela fonctionne. Il vous suffit de créer une source de données portant le même nom que la source de données référencée dans le rapport que vous publiez. Voici un exemple de MSDN utilisant ReportingService2010:

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

Voici le code pour publier un rapport et créer une source de données, bien que cela ne soit pas écrit pour Reportingservice2010, il ne devrait pas être difficile de le transférer à 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);
}
}

2
2017-08-24 14:06



Je voulais juste offrir quelques conseils. J'ai rencontré quelques problèmes il y a environ un an avec les services ReportingService et j'ai également trouvé peu d'informations en ligne, alors ce que j'ai appris de ce que j'ai publié ici - J'espère que cela vous aidera.

http://www.ericwitkowski.com/2013/05/an-introduction-to-querying-and.html


2
2018-02-18 18:38