문제

SQL Server Reporting Services 보고서를 배포하기 위해 반복 가능한 프로세스를 만들어야 합니다.저는 Visual Studio나 Business Development Studio를 사용하여 이 작업을 수행하는 것을 선호하지 않습니다.배포 스크립팅의 rs.exe 방법도 다소 투박해 보입니다.보고서를 배포할 수 있는 매우 우아한 방법을 가진 사람이 있습니까?여기서 핵심은 프로세스가 완전히 자동화되기를 원한다는 것입니다.

도움이 되었습니까?

해결책

우리는 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

다른 팁

나는 스크립트를 사용했다 @데이비드 제공했지만 몇 가지 코드를 추가해야 했습니다. (댓글을 달기에는 너무 길기 때문에 답변으로 입력하고 있습니다.

문제는:보고서 정의의 보고서에 이미 "공유 데이터 소스"가 첨부되어 있는 경우 이는 스크립트에서 생성된 데이터 소스와 결코 동일하지 않습니다.

이는 "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을 사용해야 합니다.보고서대신 데이터 소스:

rs.SetReportDataSources(targetFolder + "/" + reportName.Substring(0, reportName.Length - 4), dataSourceRefs)

글쎄요 별로 우아하진 않네요.우리는 Reportingservices2005 웹 서비스를 사용하는 자체 도구를 만들었습니다.우리는 이것이 우리가 원하는 것을 얻는 가장 신뢰할 수 있는 방법이라는 것을 알았습니다.

그다지 어렵지 않으며 필요에 따라 데이터 소스 및 폴더 생성과 같은 다른 작업을 수행하도록 확장할 수 있습니다.

나는 강력히 추천한다 RSScripter.개요에 언급된 바와 같이:

Reporting Services Scripter는 모든 Microsoft SQL Server Reporting Services 카탈로그 항목을 스크립팅 및 전송하여 한 서버에서 다른 서버로 전송하는 데 도움이되는 .NET Windows Forms 응용 프로그램입니다.또한 한보고 서비스 폴더에서 동일한 서버의 대량의 질량을 쉽게 이동하는 데 사용할 수 있습니다.선택한 스크립팅 옵션에 따라보고 서비스 스크립터는 설명, 히스토리 옵션, 실행 옵션 (보고서 별 및 공유 일정 포함), 구독 (일반 및 데이터 중심) 및 서버 측보고 매개 변수와 같은 모든 카탈로그 항목 속성을 전송할 수도 있습니다.

이 작업을 수행하는 데 Business Development Studio를 선호하지 않는다고 말씀하신 것을 알고 있지만 내장된 도구는 매우 안정적이고 사용하기 쉽습니다.

CruiseControl.NET과 같은 지속적인 통합 솔루션을 살펴보셨나요?rs.exe를 사용하여 보고서를 배포할 수 있는 경우 CruiseControl에서 자동화된 프로세스를 설정하여 타이머에 따라 또는 보고서가 수정될 때마다 보고서를 작성 및 배포할 수 있습니다.

우리 환경에서는 버전 제어를 사용하여 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 스크립트를 검색할 때 우연히 발견했기 때문에 이 질문에 대한 답변을 제공해야겠다고 생각했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top