我需要建立一个重复的过程中为部署SQL服务器上报服务的报告。我不赞成利用Visual Studio和或商业发展工作室来做到这一点。的rs.exe 方法的脚本的部署似乎也不笨重。任何人都不会有一个非常优雅的方式,他们已经能够部署的报告。这里的关键是,我想该过程是完全自动化。

有帮助吗?

解决方案

我们使用rs.exe一旦我们开发的脚本我们不需要碰它了,这只是工作。

这里是源(I稍微修改它的手中删除敏感的数据没有一个机会,以测试它,希望我没有任何东西的刹车),它部署的报告及相关图像目录对于各种语言。还据源创建的。

'=====================================================================
'  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.SetItemDataSources(targetFolder + "/" + reportName.Substring(0, reportName.Length - 4), dataSourceRefs)

注意,这最后一个电话只是RS2005年或更高。如果你想要载你的报告上一个RS2000服务器,你必须要使用置报告数据源代替:

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

不真的很优雅。我们创造了我们自己的工具,使用reportingservices2005网服务。我们发现这是最可靠的方式得到我们想要什么。

这不是真的那么难让你把它扩展到做其他的事情比如创建数据来源和文件夹的要求。

我强烈推荐 RSScripter.正如在介绍:

报告服务编剧是一个。净 Windows形式应用程序,使 脚本和转让所有 Microsoft SQL Server报告 服务目录项目的帮助 他们转移,从一个服务器 另一个。它也可以被用来方便 移动物品的质量从一个报告 服务的文件夹到另一个同样 服务器。根据脚本 选项的选择,报告服务 编剧也可以转让的所有目录 项目的性质如说明, 历史选择,执行选项 (包括报告中提供具体和共享 计划)、订阅(正常 数据驱动)和服务方报告 参数。

我知道你说你是不是有利于企业发展工作室来做到这一点,但我已经找到了内在的工具是非常可靠的和易于使用。

你有没有看到任何连续的一体化的解决方案,例如CruiseControl.NET?如果你能够部署使用报告rs.exe 然后你可以安装一个自动化的过程中CruiseControl来构建和部署的报告在一定时器或者每当一个报告进行修改。

在我们的环境中,我们发展中VS版本控制然后部署到开发SSR.一旦该报告进行了验证,我们使用ReportSync计划部署的报告 ReportServer DEVReportServer PROD.的RS.EXE 脚本中仍然有自己的位置,但是我发现ReportSync是一个更简单和灵活的方式来促进一个报告。

ReportSync:

ReportSync 是一个开放源应用程序可以免费下载和使用。它的伟大工程,对于下载报告中散,它甚至可以推动一个报告从一个服务器到另一个服务器。


如何获得下载的计划?

如何部署一个报告?

  1. 运行和可执行的接口将会启动。
  2. 使用 SOURCEDESTINATION 对话的选择 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