1.使用报表管理器,创建报表目录、数据源,上传报表文件。这种方式仅适合非常少量的报表,或对个别报表进行更新时使用。
2.使用开发环境的DEPLOY功能,指定TargetServerURL、TargetFolder等属性即可很方便地将所有报表发布到指定环境。这种方式虽然方便,但却要求开发环境,而这是不可能随时随地都能得以满足的。
3.使用脚本文件和Reporting Services简单对象访问协议(SOAP)API ,只需将安装脚本文件及报表定义文件RDL拷贝到某一目录下,然后指定一些命令参数即可轻松完成报表的发布,当然您必须拥有RS实用工具的运行权限,以及在报表服务器上创建目录和上传文件的权限,而这些权限一般情况下都不成问题,正常情况下,Reporting Services安装完毕后,RS实用工具就已经在默认命令行的path中了。
联机文件中提供了一个示例的脚本,我对其增加了一些功能,可以判断文件夹及数据源是否已经存在,从而防止重复创建,并可以自动遍历当前目录下的报表文件进行发布。
注意:该脚本必须用Visual Studio VB.NET语言编写,象Left这样的函数必须完全指定名字空间才能正确编译通过。
'
parentFolder是用rs脚本命令行开关-v定义的全局变量
Dim definition As [ Byte ]() = Nothing
Dim warnings As Warning() = Nothing
Dim parentPath As String = " / " + parentFolder
Dim filePath As String = "" ' 当前目录
Public Sub Main() Sub Main()
rs.Credentials = System.Net.CredentialCache.DefaultCredentials
Dim name As String
Dim items As CatalogItem() = Nothing
dim FolderExist,DataSourceExist as boolean
Try
items = rs.ListChildren("/", True) '假设本项目在ReportServer根目录下创建
dim i as Integer
for i=0 to items.length-1
if items(i).name.toUpper=parentFolder.toUpper and items(i).Type=1 Then '1=Folder
FolderExist=True
end if
if items(i).name.toUpper=parentFolder.toUpper and items(i).Type=5 Then '1=DataSource
DataSourceExist=True
end if
next
Catch e As SoapException
Console.WriteLine(e.Detail.InnerXml.ToString())
End Try
if FolderExist THEN
Console.WriteLine("文件夹已经存在!")
ELSE
Try
rs.CreateFolder(parentFolder, "/", Nothing)
Console.WriteLine("文件夹: {0} 成功创建!", parentFolder)
Catch e As Exception
Console.WriteLine(e.Message)
End Try
END IF
if FolderExist and DataSourceExist THEN
Console.WriteLine("数据源已经存在!")
else
CreateEstateDataSource()
end if
Try
Dim di As DirectoryInfo
if filePath="" then di = new DirectoryInfo(".") else di = new DirectoryInfo(filePath)
Dim files As FileInfo() = di.GetFiles("*.rdl")
Console.WriteLine("共 {0} 个报表文件", files.Length)
Dim fiNext As FileInfo
For Each fiNext In files
PublishReport(Microsoft.VisualBasic.Left(fiNext.name,fiNext.name.length-4))
Next
Catch e As Exception
Console.WriteLine("搜索报表文件失败: {0}", e.ToString())
End Try
End Sub
Public Sub CreateEstateDataSource() Sub CreateEstateDataSource()
Dim name As String = parentFolder '数据源名与文件夹名相同
Dim parent As String = "/" + parentFolder
Dim definition As New DataSourceDefinition()
definition.CredentialRetrieval = CredentialRetrievalEnum.Store
definition.UserName="sa"
definition.Password="******"
definition.ConnectString = "data source=(local);initial catalog=" & parentFolder '假设数据库名也与文件夹名相同
definition.Enabled = True
definition.EnabledSpecified = True
definition.Extension = "SQL"
definition.ImpersonateUser = False
definition.ImpersonateUserSpecified = True
definition.Prompt = Nothing
definition.WindowsCredentials = False
Try
rs.CreateDataSource(name, parent, False, definition, Nothing)
Console.WriteLine("数据源: {0} 成功创建!", name)
Catch e As Exception
Console.WriteLine(e.Message)
End Try
End Sub
Public Sub PublishReport() Sub PublishReport(ByVal reportName As String)
Try
Dim stream As FileStream = File.OpenRead(filePath + reportName + ".rdl")
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
warnings = rs.CreateReport(reportName, parentPath, 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("报表: {0} 成功布署!", reportName)
End If
Catch e As Exception
Console.WriteLine(e.Message)
End Try
End Sub
Dim definition As [ Byte ]() = Nothing
Dim warnings As Warning() = Nothing
Dim parentPath As String = " / " + parentFolder
Dim filePath As String = "" ' 当前目录
Public Sub Main() Sub Main()
rs.Credentials = System.Net.CredentialCache.DefaultCredentials
Dim name As String
Dim items As CatalogItem() = Nothing
dim FolderExist,DataSourceExist as boolean
Try
items = rs.ListChildren("/", True) '假设本项目在ReportServer根目录下创建
dim i as Integer
for i=0 to items.length-1
if items(i).name.toUpper=parentFolder.toUpper and items(i).Type=1 Then '1=Folder
FolderExist=True
end if
if items(i).name.toUpper=parentFolder.toUpper and items(i).Type=5 Then '1=DataSource
DataSourceExist=True
end if
next
Catch e As SoapException
Console.WriteLine(e.Detail.InnerXml.ToString())
End Try
if FolderExist THEN
Console.WriteLine("文件夹已经存在!")
ELSE
Try
rs.CreateFolder(parentFolder, "/", Nothing)
Console.WriteLine("文件夹: {0} 成功创建!", parentFolder)
Catch e As Exception
Console.WriteLine(e.Message)
End Try
END IF
if FolderExist and DataSourceExist THEN
Console.WriteLine("数据源已经存在!")
else
CreateEstateDataSource()
end if
Try
Dim di As DirectoryInfo
if filePath="" then di = new DirectoryInfo(".") else di = new DirectoryInfo(filePath)
Dim files As FileInfo() = di.GetFiles("*.rdl")
Console.WriteLine("共 {0} 个报表文件", files.Length)
Dim fiNext As FileInfo
For Each fiNext In files
PublishReport(Microsoft.VisualBasic.Left(fiNext.name,fiNext.name.length-4))
Next
Catch e As Exception
Console.WriteLine("搜索报表文件失败: {0}", e.ToString())
End Try
End Sub
Public Sub CreateEstateDataSource() Sub CreateEstateDataSource()
Dim name As String = parentFolder '数据源名与文件夹名相同
Dim parent As String = "/" + parentFolder
Dim definition As New DataSourceDefinition()
definition.CredentialRetrieval = CredentialRetrievalEnum.Store
definition.UserName="sa"
definition.Password="******"
definition.ConnectString = "data source=(local);initial catalog=" & parentFolder '假设数据库名也与文件夹名相同
definition.Enabled = True
definition.EnabledSpecified = True
definition.Extension = "SQL"
definition.ImpersonateUser = False
definition.ImpersonateUserSpecified = True
definition.Prompt = Nothing
definition.WindowsCredentials = False
Try
rs.CreateDataSource(name, parent, False, definition, Nothing)
Console.WriteLine("数据源: {0} 成功创建!", name)
Catch e As Exception
Console.WriteLine(e.Message)
End Try
End Sub
Public Sub PublishReport() Sub PublishReport(ByVal reportName As String)
Try
Dim stream As FileStream = File.OpenRead(filePath + reportName + ".rdl")
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
warnings = rs.CreateReport(reportName, parentPath, 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("报表: {0} 成功布署!", reportName)
End If
Catch e As Exception
Console.WriteLine(e.Message)
End Try
End Sub
将以上脚本(假设为sample.rss)与报表定义文件rdl放在同一目录下,执行类似这样的命令即可:
rs
-
i sample.rss
-
s http:
//
localhost
/
reportserver
-
v parentFolder
=
"
sampleFolder
"