Auch wenn mittlerweile SQL Server 2008 in den Startlöchern steht - die Realität sieht zumeist (viel) älter aus. So hatte ich vor kurzem einen Datenbankumstieg, wo von einem alten Datenbankserver auf einen neuen zu migrieren war. Die Datenbank selbst war zwar SQL Server 2005, das war jedoch ein Upgrade von einem SQL Server 2000. Eigentlich kein Problem, doch passten die (beim 2000er SQL Server noch zusätzlich zu installierenden) Reporting Services nicht zur DB-Version 2005 und waren noch RS 2000 SP2.

grid.ai

Die Reporting Services (RS) sind übrigens Bestandteil des SQL Servers und bieten Report-Erstellung, Management und eine skalierbare Bereitstellung. Eine Weboberfläche am Reporting Server dient zur Administration, die Bereitstellung kann per URL oder auch per Webservice erfolgen.

Nachdem es bei unserer Umstellung ein paar Stolpersteine gab, hier ein paar Tipps für den Umstieg SQL Server 2000 Reporting Services auf 2005.

Die RDL-Syntax:

Die Übernahme der Reports in die neuen SQL 2005 RS war problemlos, außer dass ich die Erfahrung gemacht habe, dass RS 2005 Syntax-Fehler nicht verzeiht. So kam bei einem Report ein Fehler in einer "Hidden"-Eigenschaft (das wars auch schon mit dem Hinweis, wo der Fehler zu suchen war).

Nach Ansicht der Report-Codeansicht mit Taste F7 und manuellen Durchsehen aller Hidden-Ausdrücke war der Schuldige identifiziert:

=iif(trim(Fields!SEM_Text1.Value) <> "", Fields!SEM_Text1.Value, "")

Nun Hidden erwartet True oder False - in meinem Fall stand hier aber fälschlicherweise ein Stringausdruck. Klar, so kann das nicht funktionieren. Also Zeile(n) ausbessern und ausprobieren:

=iif(trim(Fields!SEM_Text1.Value) <> "", False, True)

Jetzt funktioniert der Report auch in 2005. Fein! Noch ein Hinweis zum RDL-Format: Mit 2005 wurde das RDL-Format erweitert und ist nicht mehr abwärtskompatibel.

Report-Dateien (.rdl) für RS 2005 können aber nach wie vor mit Visual Studio 2003 erstellt und verändert werden. Reports aus VS 2005 werden jedoch im Format RS 2005 gespeichert. Diese Reports können dann nicht mehr mit VS 2003 bearbeitet werden. RS versteht aber beide Formate.

Nach Lösen dieses Problems kam dann eine weitere Hürde.

Automatisiertes Erstellen von Reports per Script:

In unserem Szenario haben wir einfache Scripts mit dem RS.exe Tool verwendet, um Reports zu bestimmten Zeiten automatisch als PDF-File zu erstellen. Eigentlich eine sehr praktische Sache. Dummerweise klappten die Scripts mit RS 2005 nicht mehr...

Der Aufruf von rs.exe per Scheduled Tasks erfolgt so:

C:\>rs -i D:\Tasks\testrs.rss -s http://db1/ReportServer$atwork

test.rss ist ein VB Script, welches vom .NET VB-Compiler verarbeitet wird:

' File: testrs.rss by atwork
Dim format as string = "PDF"
Dim fileName as String = "D:\Tasks\myreport.pdf"
Dim reportPath as String = "/mydir/myreport"
Public Sub Main()
    ' Prepare Render arguments
    Dim historyID as string = Nothing
    Dim deviceInfo as string = Nothing
    Dim showHide as string = Nothing
    Dim results() as Byte
    Dim encoding as string
    Dim mimeType as string = "pdf"
    Dim warnings() AS Warning = Nothing
    Dim reportHistoryParameters() As ParameterValue = Nothing
    Dim streamIDs() as string = Nothing
    rs.Credentials = System.Net.CredentialCache.DefaultCredentials
    ' Report with Parameters
    Dim parameters(0) As ParameterValue
    parameters(0) = New ParameterValue()
    parameters(0).Name = "id"
    parameters(0).Value = "1234"
    results = rs.Render(reportPath, format, Nothing, Nothing, parameters, Nothing, Nothing, encoding, mimeType, reportHistoryParameters, warnings, streamIDs)
    ' Open a file stream and write out the report
    Dim stream As FileStream = File.OpenWrite(fileName)
    stream.Write(results, 0, results.Length)
    stream.Close()
End Sub

Der RS-Aufruf erzeugte den Fehler:

Microsoft (R) Visual Basic Compiler version 8.0.50727.832 for Microsoft (R) .NET Framework version 2.0.50727.832 Copyright (c) Microsoft Corporation.  All rights reserved.

C:\Documents and Settings\atwork\Local Settings\Temp\1\zv3y0cit.1.vb(60) : error
BC30456: 'Render' is not a member of 'Microsoft.SqlServer.ReportingServices2005
.ReportingService2005'.

    results = rs.Render(reportPath, format, Nothing, Nothing, parameters, Nothing, Nothing, encoding, mimeType, reportHistoryParameters, warnings, streamIDs)
              ~~~~~~~~~

Ok, also die Render-Methode funktioniert angeblich nicht mehr. Also nach der Ursache forschen. Hier hatte ich netterweise Hilfe von Markus Oswald, unserem Microsoft PTC (Partner Technical Consultant), der mir auch den entscheidenden schnellen Workaround lieferte:

RS 2005 läuft gegen den neuen 2005er SOAP Endpoint. Zum Glück wird der "alte" RS 2000 Endpoint des Webservices noch weiter unterstützt. Dazu ist nur bei Aufruf des RS-Tools der Schalter "-e mgmt2000" anzuhängen, um den alten Endpoint aufzurufen. Simple as that!

C:\>rs -i D:\Tasks\testrs.rss -s http://db1/ReportServer$atwork -e mgmt2000

So klappt der Aufruf des neuen RS-Tools (und der Kunde freut sich darüber, dass es eine schnelle, einfache Lösung gibt und die automatisierten Dokumente wieder verfügbar sind)! Auch wenn das nur einer (von vielen) Lösungswegen ist (kurz dachte ich darüber nach, ein eigenes kleines .net Tool für die Konsumation des RS-Services zu schreiben...), zählte im aktuellen Fall die rasche Lösung und die gewohnte Funktionalität.

Es führen viele Wege zu Reporting Services 2005!

Beitrag von Toni Pohl