Развертывание Служб Reporting Services
Мне нужно создать повторяемый процесс для развертывания отчетов служб SQL Server Reporting Services. Я не сторонник использования Visual Studio и или Business Development Studio для этого. РС.exe-метод развертывания сценариев также кажется довольно неуклюжим. Есть ли у кого-нибудь очень элегантный способ, которым они смогли развернуть отчеты. Ключ здесь в том, что я хочу, чтобы процесс был полностью автоматизирован.
6 ответов:
Мы используем rs.exe, после того, как мы разработали скрипт, нам больше не нужно его трогать, он просто работает.
Вот источник (я немного модифицировал его вручную, чтобы удалить конфиденциальные данные без возможности проверить его, надеюсь, я ничего не тормозил), он развертывает отчеты и связанные с ними изображения из подкаталогов для различных языков. Также создается источник данных.
'===================================================================== ' 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Вот пакет для вызова rs.exe:
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
Я использовал скрипт @David , но мне пришлось добавить некоторый код (я печатаю это как ответ, так как это было бы слишком долго для комментария.
Проблема в том, что если в определении отчета уже есть "общий источник данных", то он никогда не будет таким же источником данных, как тот, который был создан в скрипте.
Это также становится очевидным из предупреждения, выдаваемого методом "CreateReport":
Набор данных " относится к общему источник данных", который не публикуется на сервере отчетов.
Таким образом, источник данных должен быть установлен явно позже. Я внес следующие изменения в код:
Я добавил глобальную переменную:
Dim dataSourceRefs(0) As DataSourceВ конце метода CreateDataSource эта переменная заполняется:
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И в методе PublishReport этот источник данных получает явное значение (после вызова CreateReport):
Обратите внимание, что этот последний вызов является только RS 2005 или выше. Если если вы хотите загрузить отчеты на сервер RS 2000, Вы должны использовать SetReportDataSources вместо:rs.SetItemDataSources(targetFolder + "/" + reportName.Substring(0, reportName.Length - 4), dataSourceRefs)rs.SetReportDataSources(targetFolder + "/" + reportName.Substring(0, reportName.Length - 4), dataSourceRefs)
Ну не очень элегантно. Мы создали свой собственный инструмент, который использует веб-сервис reportingservices2005. Мы обнаружили, что это самый надежный способ получить то, что мы хотим.
На самом деле это не так сложно, и вы можете расширить его, чтобы делать другие вещи, такие как создание источников данных и папок по мере необходимости.
Я настоятельно рекомендую RSScripter. Как отмечено в обзоре:
Скриптер служб Reporting Services-это .NET Приложение Windows Forms, которое позволяет написание сценариев и передача всего Отчеты Microsoft SQL Server Каталог услуг предметы для помощи в перенос их с одного сервера на другой. другой. Его также можно легко использовать для перемещение элементов по массе из одного отчета Папки служб в другую на том же сервер. В зависимости от сценария выбранные параметры, служба отчетов Scripter также может перенести весь каталог свойства элемента, такие как описания, Параметры истории, параметры исполнения (включая отчет конкретный и общий расписания), подписки (обычные и данных), а сторона сервера отчетов параметры.
Я знаю, что вы говорите, что не одобряете студию развития бизнеса, чтобы сделать это, но я обнаружил, что встроенные инструменты очень надежны и просты в использовании.
Рассматривали ли вы какие-либо решения непрерывной интеграции, такие как CruiseControl.NET если вы можете развернуть отчеты с помощью rs.после этого вы можете настроить автоматический процесс в CruiseControl для построения и развертывания отчетов по таймеру или при каждом изменении отчета.
Comments