在企业环境中,SSRS(SQL Server Reporting Services)报告的部署是一个重要的开发环节。本文将介绍如何使用VB.NET部署SSRS报告,并更新报告中的数据源引用。
SSRS报告可以通过调用rs.CreateReport()
方法进行部署。这个方法接受一个字节数组作为参数,而不是.rdl文件名。虽然这看起来是一个小变化,但读取文件内容并不困难。以下是VB.NET的示例代码:
Dim len As Integer
Dim fileBytes As Byte()
Using stream As FileStream = File.OpenRead(path)
len = stream.Length
fileBytes = New Byte(len - 1) {}
stream.Read(fileBytes, 0, len)
End Using
rs.CreateReport("MyReport", "Reports Folder", overwrite, fileBytes, Nothing)
如果Microsoft没有在上述链接中的错误示例中遗漏读取流的最后一个字节,那么这个过程会更加简单。有趣的是,在SQL 2000示例中,他们错误地初始化了数组,导致向SSRS服务器发送了额外的字节。结果是服务器抱怨报告末尾有非法的0×00字符。
在VB.NET中,数组中的元素数量与在Dim
中指定的数量不同,这似乎很难理解,即使是对Microsoft的人来说也是如此。更新数据源引用是另一个难题。
报告定义中存储的数据源引用是无效的。按照上述方法上传报告后,将收到类似的警告:
数据集 `DataSet1' 引用了共享数据源 `MyDataSource',该数据源未在报告服务器上发布。
HTTP流量嗅探显示,当BIDS部署报告时,它也会收到相同的警告。解决方案是在报告上传后更新数据源引用,将它们更改为"/Data Sources"文件夹中现有的数据源。
这需要几个步骤。首先,需要将报告文件加载为XML并定位所有的数据源引用。
Dim doc As System.Xml.XmlDocument = New System.Xml.XmlDocument()
doc.Load(rdlPath)
Dim nsManager As XmlNamespaceManager = New XmlNamespaceManager(doc.NameTable)
nsManager.AddNamespace("r", "http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition")
Dim nodes As XmlNodeList = doc.SelectNodes("/r:Report/r:DataSources/r:DataSource/r:DataSourceReference", nsManager)
然后,需要将这些节点转换为SSRS识别的DataSource
对象:
Dim dataSources As DataSource() = New DataSource(nodes.Count - 1) {}
For i As Integer = 0 To nodes.Count - 1
dataSources(i) = CreateDataSourceObj(nodes.Item(i))
Next
最后,需要调用rs.SetItemDataSources
方法:
rs.SetItemDataSources(serverReportPath, dataSources)
创建报告的完整代码可以在找到。创建数据源和报告的组合文件可以在找到。