Reporting Services-Bereitstellung
-
01-07-2019 - |
Frage
Ich brauche einen wiederholbaren Prozess zu schaffen für die Bereitstellung von SQL Server Reporting Services-Berichte. Ich bin nicht für den Einsatz von Visual Studio und oder Business Development Studio, dies zu tun. Die rs.exe Methode der Scripting-Implementierungen scheint auch eher klobig. Hat jemand eine sehr elegante Art und Weise, dass sie in der Lage gewesen, auf Berichte bereitstellen. Der Schlüssel hier ist, dass ich der Prozess will vollständig automatisiert werden.
Lösung
Wir verwenden rs.exe, sobald wir das Skript entwickeln wir es nicht nötig haben, mehr zu berühren, es funktioniert einfach.
Hier ist die Quelle (ich es von Hand leicht modifiziert, um sensible Daten zu entfernen, ohne eine Chance, es zu testen, ich hoffe, nicht Bremse etwas getan), es setzt Berichte sowie Bilder von Verzeichnisse für verschiedene Sprachen. Auch Datenquelle erstellt wird.
'=====================================================================
' File: PublishReports.rss
'
' Summary: Script that can be used with RS.exe to
' publish the reports.
'
' Rss file spans from beginnig of this comment to end of module
' (except of "End Module").
'=====================================================================
Dim langPaths As String() = {"en", "cs", "pl", "de"}
Dim filePath As String = Environment.CurrentDirectory
Public Sub Main()
rs.Credentials = System.Net.CredentialCache.DefaultCredentials
'Create parent folder
Try
rs.CreateFolder(parentFolder, "/", Nothing)
Console.WriteLine("Parent folder created: {0}", parentFolder)
Catch e As Exception
Console.WriteLine(e.Message)
End Try
PublishLanguagesFromFolder(filePath)
End Sub
Public Sub PublishLanguagesFromFolder(ByVal folder As String)
Dim Lang As Integer
Dim langPath As String
For Lang = langPaths.GetLowerBound(0) To langPaths.GetUpperBound(0)
langPath = langPaths(Lang)
'Create the lang folder
Try
rs.CreateFolder(langPath, "/" + parentFolder, Nothing)
Console.WriteLine("Parent lang folder created: {0}", parentFolder + "/" + langPath)
Catch e As Exception
Console.WriteLine(e.Message)
End Try
'Create the shared data source
CreateDataSource("/" + parentFolder + "/" + langPath)
'Publish reports and images
PublishFolderContents(folder + "\" + langPath, "/" + parentFolder + "/" + langPath)
Next 'Lang
End Sub
Public Sub CreateDataSource(ByVal targetFolder As String)
Dim name As String = "data source"
'Data source definition.
Dim definition As New DataSourceDefinition
definition.CredentialRetrieval = CredentialRetrievalEnum.Store
definition.ConnectString = "data source=" + dbServer + ";initial catalog=" + db
definition.Enabled = True
definition.EnabledSpecified = True
definition.Extension = "SQL"
definition.ImpersonateUser = False
definition.ImpersonateUserSpecified = True
'Use the default prompt string.
definition.Prompt = Nothing
definition.WindowsCredentials = False
'Login information
definition.UserName = "user"
definition.Password = "password"
Try
'name, folder, overwrite, definition, properties
rs.CreateDataSource(name, targetFolder, True, definition, Nothing)
Catch e As Exception
Console.WriteLine(e.Message)
End Try
End Sub
Public Sub PublishFolderContents(ByVal sourceFolder As String, ByVal targetFolder As String)
Dim di As New DirectoryInfo(sourceFolder)
Dim fis As FileInfo() = di.GetFiles()
Dim fi As FileInfo
Dim fileName As String
For Each fi In fis
fileName = fi.Name
Select Case fileName.Substring(fileName.Length - 4).ToUpper
Case ".RDL"
PublishReport(sourceFolder, fileName, targetFolder)
Case ".JPG", ".JPEG"
PublishResource(sourceFolder, fileName, "image/jpeg", targetFolder)
Case ".GIF", ".PNG", ".BMP"
PublishResource(sourceFolder, fileName, "image/" + fileName.Substring(fileName.Length - 3).ToLower, targetFolder)
End Select
Next fi
End Sub
Public Sub PublishReport(ByVal sourceFolder As String, ByVal reportName As String, ByVal targetFolder As String)
Dim definition As [Byte]() = Nothing
Dim warnings As Warning() = Nothing
Try
Dim stream As FileStream = File.OpenRead(sourceFolder + "\" + reportName)
definition = New [Byte](stream.Length) {}
stream.Read(definition, 0, CInt(stream.Length))
stream.Close()
Catch e As IOException
Console.WriteLine(e.Message)
End Try
Try
'name, folder, overwrite, definition, properties
warnings = rs.CreateReport(reportName.Substring(0, reportName.Length - 4), targetFolder, True, definition, Nothing)
If Not (warnings Is Nothing) Then
Dim warning As Warning
For Each warning In warnings
Console.WriteLine(warning.Message)
Next warning
Else
Console.WriteLine("Report: {0} published successfully with no warnings", targetFolder + "/" + reportName)
End If
Catch e As Exception
Console.WriteLine(e.Message)
End Try
End Sub
Public Sub PublishResource(ByVal sourceFolder As String, ByVal resourceName As String, ByVal resourceMIME As String, ByVal targetFolder As String)
Dim definition As [Byte]() = Nothing
Dim warnings As Warning() = Nothing
Try
Dim stream As FileStream = File.OpenRead(sourceFolder + "\" + resourceName)
definition = New [Byte](stream.Length) {}
stream.Read(definition, 0, CInt(stream.Length))
stream.Close()
Catch e As IOException
Console.WriteLine(e.Message)
End Try
Try
'name, folder, overwrite, definition, MIME, properties
rs.CreateResource(resourceName, targetFolder, True, definition, resourceMIME, Nothing)
Console.WriteLine("Resource: {0} with MIME {1} created successfully", targetFolder + "/" + resourceName, resourceMIME)
Catch e As Exception
Console.WriteLine(e.Message)
End Try
End Sub
Hier ist der Ansatz der rs.exe zu nennen:
SET ReportServer=%1
SET DBServer=%2
SET DBName=%3
SET ReportFolder=%4
rs -i PublishReports.rss -s %ReportServer% -v dbServer="%DBServer%" -v db="%DBName%" -v parentFolder="%ReportFolder%" >PublishReports.log 2>&1
pause
Andere Tipps
habe ich das Skript @ David geliefert, aber ich hatte einige Code hinzufügen ( ich bin diese Eingabe als Antwort auf, wie dies für einen Kommentar zu lang sein würde.
Das Problem ist: Wenn es bereits eine „gemeinsame Datenquelle“ an einen Bericht in der Berichtsdefinition, das ist nie die gleiche Datenquelle wie die, die in dem Skript erstellt wird.
Dies wird auch aus der Warnung durch den „Create“ -Verfahren emittiert:
Der Datensatz ‚‘ bezieht sich auf die freigegebene Datenquelle ‚‘, das nicht auf dem Berichtsserver veröffentlicht wird.
So hat die Datenquelle explizit danach eingestellt werden. Ich habe folgende Code Änderungen vorgenommen:
Ich habe eine globale Variable:
Dim dataSourceRefs(0) As DataSource
Am Ende der Create Methode, diese Variable gefüllt wird:
Dim dsr As New DataSourceReference
dsr.Reference = "/" + parentFolder + "/" + db
Dim ds As New DataSource
ds.Item = CType(dsr, DataSourceDefinitionOrReference)
ds.Name = db
dataSourceRefs(0) = ds
Und in der PublishReport Methode, wird die Datenquelle explizit festgelegt (nach Create genannt wurde):
rs.SetItemDataSources(targetFolder + "/" + reportName.Substring(0, reportName.Length - 4), dataSourceRefs)
Beachten Sie, dass dieser letzte Anruf nur 2005 RS ist oder höher. Wenn Sie Ihre Berichte auf einen RS 2000-Server laden möchten, müssen Sie Set verwenden, Bericht Datasources anstatt:
rs.SetReportDataSources(targetFolder + "/" + reportName.Substring(0, reportName.Length - 4), dataSourceRefs)
Nun, nicht wirklich elegant. Wir haben unser eigenes Tool, das den reportingservices2005 Web-Dienst verwendet. Wir fanden dies der zuverlässigste Weg, um zu sein, was wir wollen.
Es ist nicht wirklich so schwierig und man läßt es erweitern, um andere Dinge zu tun, wie Erstellung von Datenquellen und Ordnern nach Bedarf.
Ich empfehle RSScripter . Wie in der Übersicht festgestellt:
Reporting Services Autor ist ein .NET Windows Forms-Anwendung, die ermöglicht, Scripting und Übertragung aller Microsoft SQL Server Reporting Dienstkatalog Artikel zur Hilfe bei der Übertragen sie von einem Server auf Ein weiterer. Es kann auch verwendet werden, um leicht Elemente auf Masse von einer Bericht Dienstleistungen Ordner in einen anderen auf dem gleichen Server. Je nach scripting Optionen gewählt, Reporting Service Scripter kann auch alle Kataloge übertragen Elementeigenschaften wie Beschreibungen, Geschichte Optionen, Ausführungsoptionen (Einschließlich Bericht spezifische und gemeinsame Zeitplan), Abonnements (normal und data driven) und Server-Seite Bericht Parameter.
Ich weiß, Sie sagen, dass Sie nicht für das Business Development Studio sind, dies zu tun, aber ich habe die integrierten Tools als sehr zuverlässig und einfach zu bedienen.
gefundenHaben Sie sich in jede Continuous Integration-Lösungen wie CruiseControl.NET? Wenn Sie in der Lage, Berichte zu implementieren mit rs.exe dann können Sie Setup ein automatisierter Prozess in CruiseControl- erstellen und bereitstellen Ihre Berichte über einen Timer oder immer dann, wenn ein Bericht geändert wird.
In unserer Umwelt entwickeln wir in VS mit Versionskontrolle dann DEV SSRS bereitstellen. Sobald der Bericht bestätigt wird, verwenden wir ReportSync Programm Berichten von ReportServer DEV
bereitstellen ReportServer PROD
. Die rs.exe Skripte hat noch ihren Platz, aber ich habe ReportSync eine viel einfachere und agile Art und Weise zu fördern, einen Bericht festgestellt.
ReportSync:
ReportSync
ist ein Open-Source-Programm kostenlos herunterzuladen und zu verwenden. Es funktioniert gut für Berichte in loser Schüttung Herunterladen, und es kann sogar einen Bericht von einem Server auf einem anderen Server schieben.
Wie kommt man das Programm herunterladen?
-
die Quellcode-Dateien herunterladen von Github: Phires / ReportSynch , Run VS, Open die Lösungsdatei (SLN), kompilieren Sie das Programm, finden die ausführbare Datei (.exe) aus dem C: \ Temp \ reportsync-Master \ bin \ Release Ordner. Schließlich rettete die .EXE irgendwo für Sie regelmäßig verwenden
-
Wie kann ich SSRS Berichte auf einen neuen Server kopieren, wenn ich nicht der Besitzer der Berichte am -> ReportSync Antwort von nunespascal
Wie man einen Bericht implementieren?
- Führen Sie die ausführbare Datei und die Schnittstelle wird gestartet.
- Mit den
SOURCE
undDESTINATION
Dialogen einsingle report
,multiple reports
oder eineentire folder of reports
wählen. Sie können Sie sich jeden Zielordner mögen. (TIPP:. Sie können auch den gleichen Server Ziel, wenn Sie wollen, einen Bericht über den gleichen Server duplizieren) - Nachdem Sie Ihre Auswahl drücken Sie die
Sync button
- Gehen Sie auf dem Zielserver, und bestätigen die Wirkung Änderung durch die Überprüfung der von Datum geändert hat.
Dieses Tool ist sehr bequem, aber ich habe einige Macken bemerkt. Zum Beispiel when I want to update just one report that already exists in the destination
, hier ist das, was ich [Source:Report> Target:Folder> Sync
] Auswählen-- haben. ACHTUNG: Man könnte denken, Sie den Zielserver Bericht auswählen würden, sie zu aktualisieren, aber ich habe versucht, diese und der Bericht nicht aktualisiert.
Was kann ReportSync tun?
-
Es gibt auch eine
Export
-Funktion, die für einfach Dumping all RDL-Dateien in einen Ordner für mich Zugang wunderbar funktioniert. Dies ist hilfreich für den Fall, müssen Sie den Server migrieren, fügen Sie die Dateien auf eine VS-Lösung Projekt, oder irgendetwas anderes tun, werden alle Dateien. -
In meinen Tests dieses Programm nicht wandern andere content-- Abonnements, freigegebene Datenquellen gemeinsam genutzten Datensätzen. Es ist nur anwendbar auf die Berichtsdateien.
Ich weiß, dass dieser Beitrag ist alt, aber ich kam über ihn, wenn rs.exe Skripte Forschung, so dachte ich, ich hätte gerne eine Antwort auf diese Frage geben.