以下脚本对网上搜到的(见上篇转载文章)做了一些修改。首先,取消数据源的发布。在原脚本中将发布一个定义的数据源,然后所有报表的数据源同时指向这个发布的数据源。这在现实环境中是不现实的,所以修改后的脚本不再发布数据源。默认所有的数据源已发布到服务器指定的目录中(脚本中定义的datasourceFolderName)。另外,原脚本中只支持一张报表有一个数据源,而现实中很可能会出现一张报表联到多个数据源的情况。此时运行原脚本则所有的数据源都会被改成相同的而导致实际上报表无法正常运行。改进后的脚本允许一张报表中含有多个数据源的情况。在发布报表时会将报表中的数据源替换为数据源目录下的同名数据源。因此,在发布报表之前需要先将所有的数据源先发布到报表服务器上。
deploy.bat
- @echo off
- REM configure file with the path
- set config="deployReport.rss"
- REM target reporting services
- set server="http://dc1/reportserver"
- REM report folder
- set filePath="C:\\reports\\"
- REM target reporting services folder
- set reportsFolderName="test"
- REM target data sources folder
- set datasourceFolderName="Data Sources"
- REM execute log
- set log="C:\log.txt"
- rs -i %config% -s %server% -v filePath=%filePath% -v reportsFolderName=%reportsFolderName% -v datasourceFolderName=%datasourceFolderName% >%log%
- rem pause
deployReport.rss
- Dim definition As [Byte]() = Nothing
- Dim warnings As Warning() = Nothing
- Dim datasourceFolderPath As String = "/" + datasourceFolderName
- Dim reportsFolderPath As String = "/" + reportsFolderName
- Public Sub Main()
- rs.Credentials = System.Net.CredentialCache.DefaultCredentials
- CreateReportFolder(reportsFolderName)
- DeployRepors(filePath)
- End Sub
- Public Sub CreateReportFolder(ByVal reportFolder As String)
- Try
- rs.CreateFolder(reportFolder,"/",Nothing)
- Console.WriteLine("Parent Folder Created:{0}",reportFolder)
- Catch e As Exception
- Console.WriteLine(e.Message)
- End Try
- End Sub
- Public Sub DeployRepors(ByVal filePath As String)
- Dim tempFileAry As String()
- Dim reportFilePath as String
- tempFileAry = Directory.GetFiles(filepath)
- For Each reportFilePath In tempFileAry
- Dim fileName As String
- fileName = reportFilePath.Substring(reportFilePath.LastIndexOf("\") + 1)
- Dim fileSuffix As String
- fileSuffix = fileName.Substring(fileName.LastIndexOf(".") + 1)
- Select Case fileSuffix
- Case "rdl"
- PublishReport(fileName,fileSuffix)
- End Select
- Next
- End Sub
- Public Sub PublishReport(ByVal reportName As String,ByVal fileSuffix As String)
- Try
- Dim stream As FileStream = File.OpenRead(filePath + 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
- If(fileSuffix="rdl") Then
- warnings = rs.CreateReport(reportName.Substring(0,reportName.LastIndexOf(".")),reportsFolderPath, true, definition, Nothing)
- SetReportDataSourceRef(reportName.Substring(0,reportName.LastIndexOf(".")))
- End If
- 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", reportName)
- End If
- Catch e As Exception
- Console.WriteLine(e.Message)
- End Try
- End Sub
- Public Sub SetReportDataSourceRef(ByVal reportName As String)
- Try
- Dim datasources As [DataSource]() = rs.GetItemDataSources(reportsFolderPath + "/" + ReportName)
- dim i as integer
- for i=0 to datasources.getlength(0)-1
- Dim Item1 as DataSourceReference = New DataSourceReference
- Item1.Reference = "/Data Sources/"+datasources(i).name
- datasources(i).Item = Item1
- next i
- rs.SetItemDataSources(reportsFolderPath + "/" + ReportName, datasources)
- Catch _exception As Exception
- Console.WriteLine(_exception)
- End Try
- End Sub
本文转自 boyi55 51CTO博客,原文链接:http://blog.51cto.com/boyi55/450776,如需转载请自行联系原作者