Das eine oder andere HowTo um den SQL Server ReportingService anzusprechen funktionierten bei mir immer nur zur Hälfte. Wem es genau so geht, hier eine kleine Anleitung, wie man den ReportingService unter VS2008 via WSDL konsumiert.
Zieldefinition: Über eine C# Applikation wird es ermöglich, ein Bericht über die SQL Server Reporting WSDL Schnittstelle als PDF zu rendern und zu speichern. Der Bericht muss dazu auf dem ReportServer vorhanden sein. Möchte man einen Bericht erstellen, kann er z.B. den ReportBuilder 3.0 dazu verwenden.
Okay lets go.
Man fügt dem Projekt zu Beginn einen Dienstverweis hinzu, folgende URL (Server anpassen : ) zum ReportService wird dazu verwendet.
1 | http://<SERVER>/reportserver/reportservice2005.asmx?wsdl |
Der Securityknoten in der automatisch angelegten app.conf wird durch folgende Einträge angepasst
1 2 3 4 5 | <security mode="TransportCredentialOnly"> <transport clientCredentialType="Ntlm" proxyCredentialType="Windows" realm=""> </transport> </security> |
Die Using Direktive für den Client findet man in der eben angelegten ServiceReference, in meinem Fall lautet diese
1 | using SQLReportingServiceTest.ReportingService; |
Für die Render Methode benötigen wir unter anderen noch einige Variablen und den entsprechenden Clientaufruf.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | //Das Format, in dem der Bericht gerendert werden soll. Dieses Argument ist einer Renderingerweiterung zugeordnet. Zu den unterstützten Formaten gehören Microsoft Office Excel, PDF und Image. string format = "PDF"; //[out] Die beim Rendern des Berichtsinhalts verwendete Codierung. string encoding; //[out] Der MIME-Typ des gerenderten Berichts. string mimeType; //[out] Die für die Ausgabedatei verwendete Dateinamenerweiterung. string extension; // [out] Ein Array von Warning-Objekten zur Beschreibung der Warnungen, die während der Berichtsverarbeitung ausgegeben wurden. Microsoft.Reporting.WinForms.Warning[] warnings = null; string[] streamIDs = null; using (var rs = new ReportingService2005SoapClient()) { //Festlegen der zulässigen Identitätswechselebene (Server/Client) rs.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; //Instanz des ReportViewer-Steuerelements var rv = new ReportViewer(); //Festlegen des Verarbeitungsmodus des ReportViewer-Steuerelements. rv.ProcessingMode = ProcessingMode.Remote; //Berichtsserver festlegen rv.ServerReport.ReportServerUrl = new Uri(@"http://<SERVER>/reportserver"); //Festlegen des Pfades zum Bericht rv.ServerReport.ReportPath = @"/MeinBericht"; //Verarbeitet den Bericht und rendert ihn im angegebenen Format und speichert diesen in ein byteArray byte[] bytes = rv.ServerReport.Render(format, null, out mimeType, out encoding, out extension, out streamIDs, out warnings); //Schreibt das Resultat in ein pdf FileStream fs = File.Create("result.pdf", bytes.Length); fs.Write(bytes,0,bytes.Length); fs.Close(); } |
Nach Ausführen dieses Codes, steht im bin Ordner nun eine result.pdf zur Verfügung.
Weiterführende Links:
- ReportExecutionService.Render Method
- StackOverflow
- Create Code to generate Report Definition File
- Architektur
- MS SQL SERVER 2008 R2 ReportBuilder 3.0 (Tabellen/Matrix/Diagramme)
Viel Spass beim entwickeln : )







Achja, es muss auf Microsoft.ReportViewer.WinForms und System.Windows.Forms referenziert werden.