Deployment Reporting Services部署
我需要为部署SQL Server Reporting Services报表创建一个可重复的过程。我不赞成使用visualstudio和/或businessdevelopmentstudio来做这件事。编写部署脚本的rs.exe方法似乎也相当笨拙。是否有人能够以非常优雅的方式部署报表。这里的关键是,我希望流程完全自动化。我知道你说你不赞成Business Development Studio这样做,但我发现内置工具非常可靠且易于使用。很不优雅。我们创建了自己的工具,使用ReportingServices2005Web服务。我们发现这是获得我们想要的最可靠的方式Deployment Reporting Services部署,deployment,reporting-services,Deployment,Reporting Services,我需要为部署SQL Server Reporting Services报表创建一个可重复的过程。我不赞成使用visualstudio和/或businessdevelopmentstudio来做这件事。编写部署脚本的rs.exe方法似乎也相当笨拙。是否有人能够以非常优雅的方式部署报表。这里的关键是,我希望流程完全自动化。我知道你说你不赞成Business Development Studio这样做,但我发现内置工具非常可靠且易于使用。很不优雅。我们创建了自己的工具,使用ReportingServi
这其实并不难,可以让您扩展它来做其他事情,如根据需要创建数据源和文件夹。您有没有研究过任何连续集成解决方案,如CruiseControl.NET?如果您能够使用rs.exe部署报告,那么您可以在CruiseControl中设置一个自动流程,以便在计时器上或报告被修改时构建和部署报告。我们使用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
我强烈推荐。如概述中所述:
Reporting Services Scripter是一个.NET脚本
Windows窗体应用程序,用于启用
脚本编写和传输所有
Microsoft SQL Server报告
服务目录项有助于
将它们从一台服务器传输到另一台服务器
另一个它也可以很容易地被使用
将批量项目从一个报表移动到另一个报表
将服务文件夹复制到同一服务器上的另一个文件夹
服务器。取决于脚本
选择的选项、报告服务
Scripter还可以传输所有目录
项目属性,例如描述,
历史记录选项,执行选项
(包括特定报告和共享报告)
计划),订阅(正常和
数据驱动)和服务器端报告
参数
我使用了提供的脚本,但我必须添加一些代码(我正在键入此作为答案,因为这对于注释来说太长了)
问题是:如果在报表定义中已经有一个“共享数据源”附加到报表,那么该数据源与脚本中创建的数据源绝不相同
从“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.SetReportDataSources(targetFolder + "/" + reportName.Substring(0, reportName.Length - 4), dataSourceRefs)
在我们的环境中,我们使用版本控制在VS中开发,然后部署到DEV SSRS。一旦报告得到验证,我们使用ReportSync程序将报告从
ReportServer DEV
部署到ReportServer PROD
。RS.EXE脚本仍然有其位置,但我发现ReportSync是一种更简单、更灵活的升级方法一份报告
ReportSync:
ReportSync
是一个免费下载和使用的开源程序。它非常适合批量下载报告,甚至可以将报告从一台服务器推送到另一台服务器
如何下载该程序
- 从下载源代码文件,运行VS,打开解决方案文件(.SLN),编译程序,从C:\Temp\reportsync master\bin\Release文件夹中查找可执行文件(.EXE)。最后,将.EXE保存到某个地方供您定期使用
- -->Nunesspascal的ReportSync回答
源
和目标
对话框选择单个报告
、多个报告
,或整个报告文件夹
。您可以选择任何想要的目标文件夹。(提示:如果要在同一服务器上复制报告,甚至可以将同一服务器作为目标。)同步按钮
当我只想更新目标中已经存在的一个报告时
,下面是我必须选择的--[源:报告>目标:文件夹>同步
]。警告:您可能认为您会选择目标服务器报表来更新它,但我已尝试此操作,但该报表未得到更新
ReportSync还能做什么
- 还有一个
功能,它非常适用于将所有RDL文件转储到一个文件夹中供我访问。这在您需要迁移服务器、将文件添加到VS解决方案项目或执行任何其他操作时都会很有帮助导出
- 在我的测试中,这个程序不迁移其他内容——订阅、共享数据源、共享数据集。它只适用于报表文件
rs.SetReportDataSources(targetFolder + "/" + reportName.Substring(0, reportName.Length - 4), dataSourceRefs)