Развертывание служб отчетов - PullRequest
       24

Развертывание служб отчетов

33 голосов
/ 18 сентября 2008

Мне нужно создать повторяющийся процесс для развертывания отчетов служб отчетов SQL Server. Я не сторонник использования Visual Studio и / или Business Development Studio для этого. Метод rs.exe сценариев также выглядит довольно неуклюжим. У кого-нибудь есть очень элегантный способ, которым они смогли развернуть отчеты. Ключевым моментом здесь является то, что я хочу, чтобы процесс был полностью автоматизирован.

Ответы [ 7 ]

32 голосов
/ 18 сентября 2008

Мы используем 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
8 голосов
/ 03 мая 2010

Я использовал предоставленный скрипт @ 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.SetItemDataSources(targetFolder + "/" + reportName.Substring(0, reportName.Length - 4), dataSourceRefs)

Обратите внимание, что этот последний вызов только RS 2005 или выше. Если вы хотите загрузить свои отчеты на сервер RS 2000, вы должны использовать Set Report DataSources вместо:

rs.SetReportDataSources(targetFolder + "/" + reportName.Substring(0, reportName.Length - 4), dataSourceRefs)
1 голос
/ 16 апреля 2010

Я настоятельно рекомендую RSScripter . Как отмечено в обзоре:

Сценарий служб отчетов - это .NET Приложение Windows Forms, которое позволяет скриптинг и передача всего Microsoft SQL Server Reporting Каталог товаров для оказания помощи в перенося их с одного сервера на другой. Это может также использоваться, чтобы легко перемещать элементы по массе из одного отчета Сервисная папка к другой на том же сервер. В зависимости от сценария выбранные варианты, службы отчетности Скриптер также может передавать весь каталог свойства элемента, такие как описания, Варианты истории, Варианты исполнения (включая конкретный и общий отчет графики), подписки (обычные и управляемый данными) и серверный отчет параметры.

1 голос
/ 18 сентября 2008

Ну, не очень элегантно. Мы создали наш собственный инструмент, который использует веб-сервис reportsservices2005. Мы обнаружили, что это самый надежный способ получить то, что мы хотим.

Это на самом деле не так сложно, и вы можете расширить его для выполнения других задач, таких как создание источников данных и папок по мере необходимости.

0 голосов
/ 22 октября 2018

В нашей среде мы разрабатываем в VS с контролем версий, а затем внедряем в DEV SSRS. После проверки отчета мы используем программу ReportSync для развертывания отчетов с ReportServer DEV до ReportServer PROD. Скрипты RS.EXE все еще имеют свое место, но я обнаружил, что ReportSync - гораздо более простой и гибкий способ продвижения отчета.

Синхронизация отчета:

ReportSync - это программа с открытым исходным кодом, которую можно бесплатно загрузить и использовать. Он отлично подходит для массовой загрузки отчетов и даже может передавать отчет с одного сервера на другой.


Как получить скачать программу?

Как развернуть отчет?

  1. Запустите исполняемый файл, и интерфейс запустится.
  2. Используйте диалоги SOURCE и DESTINATION, чтобы выбрать single report, multiple reports или entire folder of reports. Вы можете выбрать любую нужную папку. (СОВЕТ: Вы даже можете настроить таргетинг на один и тот же сервер, если хотите дублировать отчет на том же сервере.)
  3. После выбора нажмите Sync button
  4. Перейдите на целевой сервер и проверьте, вступили ли изменения в силу, просмотрев Дата изменения.

Этот инструмент был очень удобен, но я заметил некоторые причуды. Например, when I want to update just one report that already exists in the destination, вот что я должен выбрать-- [Source:Report> Target:Folder> Sync]. ВНИМАНИЕ: Вы можете подумать, что выбрали бы отчет целевого сервера для его обновления, но я пробовал это сделать, и отчет не обновляется.


Что еще может сделать ReportSync?

  • Существует также функция Export, которая прекрасно работает для простого выгрузки всех файлов RDL в папку, к которой я могу получить доступ. Это полезно в том случае, если вам нужно перенести сервер, добавить файлы в проект решения VS или сделать что-нибудь еще для всех файлов.

  • В моем тестировании эта программа не не переносила другой контент - подписки, общие источники данных, общие наборы данных. Это только применимо к файлам отчета.

Я знаю, что этот пост старый, но я сталкивался с ним при исследовании сценариев RS.EXE, поэтому я решил дать ответ на этот вопрос.

0 голосов
/ 18 сентября 2008

Рассматривали ли вы какие-либо решения для непрерывной интеграции, такие как CruiseControl.NET? Если вы можете развертывать отчеты с помощью rs.exe, то вы можете настроить автоматизированный процесс в CruiseControl для создания и развертывания отчетов по таймеру или всякий раз, когда отчет изменяется.

0 голосов
/ 18 сентября 2008

Я знаю, что вы говорите, что вы не поддерживаете Business Development Studio, но я считаю, что встроенные инструменты очень надежны и просты в использовании.

...