当我们需要把设计好的报表发布到Web服务器上时,如果用VS2005只需要 右击报表工程,单击Deploy就可轻松搞定,如果不用VS2005发布,该怎么办?
解决办法有2种。
1.引用 sqlserver2005 的web服务。根据他提供的方法发布报表
2.用sqlserver2005 的rs.exe 命名发布。
我这里介绍的是根据 rs.exe这个命令来自动发布报表的。脚本已经写好,直接Copy 稍微的改动一下即可!
1.现看看rs.exe参数 都代表什么
RUN --CMD
C:\Documents and Settings\junmy>rs /?
Microsoft (R) Reporting Services RS
版本 9.00.1399.00 x86
根据指定的报表服务器执行脚本文件内容。
RS -i 输入文件 -s serverURL [-u 用户名] [-p 密码]
[-l 超时] [-b] [-e 端点] [-v var=value] [-t]
-i 输入文件 要执行的脚本文件
-s serverURL 执行脚本
所依据的 URL (包括服务器和 vroot)。
-u 用户名 用于登录到服务器中的用户名。
-p 密码 用于登录到服务器中的密码。
-e 端点 要与脚本一起使用的 Web 服务端点。
选项为:
Exec2005 - ReportExecution2005 端点
Mgmt2005 - ReportService2005 端点
Mgmt2000 - (不推荐使用) ReportService 端点
-l 超时 连接到服务器之前
超时的秒数。默认值为 60 秒,0 表示
无限长的超时。
-b 作为批进行运行,且如果命令失败则回滚
-v var=value 传递给脚本的变量和值
-t 跟踪 在错误消息中包含跟踪信息
C:\Documents and Settings\junmy>
2.拷贝下面脚本保存deployReport.rss 相应路径根据自己的情况改动.
Dim definition As [Byte]() = Nothing
Dim warnings As Warning() = Nothing
'目录名
Dim datasourceFolderName As String = "Data Sources"
Dim datasourceFolderPath As String = "/" + datasourceFolderName
'报表目录名 所有发布的报表放在此目录
Dim reportsFolderName As String = "testDeployReports"
Dim reportsFolderPath As String = "/" + reportsFolderName
'设计好的报表 存放的路径
Dim filePath As String = "D:\Project\Reports\"
'链接字符串
Dim connectionString As String = "Data Source=localhost;Initial Catalog=DataBaseName;Connect Timeout=120"
Public Sub Main()
rs.Credentials = System.Net.CredentialCache.DefaultCredentials
'创建报表目录
CreateReportFolder(reportsFolderName)
'创建DataSource 目录
CreateReportFolder(datasourceFolderName)
'创建数据源
CreateDataSource(datasourceFolderPath)
'部署报表
DeployRepors(filePath)
End Sub
'创建目录
Public Sub CreateReportFolder(ByVal reportFolder As String)
Try
'Create Reports Folder
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","png"
PublishReport(fileName,fileSuffix)
End Select
Next
End Sub
'******************************************************************
'***** 创建数据源 **************
'*******************************************************************
Public Sub CreateDataSource(ByVal sourceFolder As String)
Dim name As String = "DetechtionCompany"
'Define the data source definition.
Dim definition As New DataSourceDefinition()
Dim dSource As New DataSource()
dsource.Item=definition
definition.CredentialRetrieval = CredentialRetrievalEnum.Integrated
definition.ConnectString =connectionString
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 = true
dsource.Name=datasourceFolderPath
Try
rs.CreateDataSource(name, sourceFolder, true, definition, Nothing)
Console.WriteLine("Created DataSource:{0}",name)
Catch e As Exception
Console.WriteLine(e.Message)
End Try
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
'********************** parentPath
If(fileSuffix="rdl") Then
warnings = rs.CreateReport(reportName,reportsFolderPath, true, definition, Nothing)
SetReportDataSourceRef(reportName)
Else If(fileSuffix="png") Then
rs.CreateResource(reportName,reportsFolderPath,true,definition,"png",Nothing)
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 reference As DataSourceReference = New DataSourceReference
Dim ds As DataSource = New DataSource
reference.Reference=datasourceFolderPath+"/DetechtionCompany"
Dim dsArray As DataSource()=rs.GetItemDataSources(reportsFolderPath+"/"+reportName)
ds=dsArray(0)
ds.Item = CType(reference, DataSourceReference)
rs.SetItemDataSources(reportsFolderPath+"/"+reportName,dsArray)
Catch _exception As Exception
Console.WriteLine(_exception)
End Try
End Sub
3. 新建deploy.dat 批处理文件 运行上面脚本。用到刚刚说的 rs.exe命名 (相应参数上面已经给出)
deploy.bat 内容
rs -i deploy.rss -s http://192.168.0.88/ReportServer -u userName -p password
双击运行deploy.bat 报表将自动发布到
http://192.168.0.88/ReportServer 服务器上。。
@author
junmy