如何在 PowerShell 中为 SSRS 报告设置正确的数据源
How to set correct DataSource in PowerShell for SSRS reports
我有一个 PowerShell 脚本,可以为报表设置正确的数据源。
我有更多数据源,例如 DS1 和 DS2。
这是我的 PowerShell 代码的一部分:
function UpgradeReport
{
param
(
[string]$t,
[string]$ReportFolder,
[string]$ReportName,
[string]$DataSourceFolder,
[string]$IssueId
)
if([string]::IsNullOrEmpty($DataSourceFolder)) { $DataSourceFolder="DS1" }
.......
# if all ok since now, report is uploaded
# set datasource if new report
if (!$reports.$reportName) {
Write-Host $reportName ' is new. Setting data source: ' $DataSourceFolder
$Proxy.SetItemDataSources("/$reportFolder/$reportName", $datasources.$DataSourceFolder)
}
Write-Output "$(Timestamp) Finished InstallReports for $ReportName"
.....
# get list of all datasources
$Proxy.ListChildren('/Data Sources', $false) | ForEach-Object { $datasources.add($_.Name,$_ ) }
问题可能出在 SetItemDataSources
我有 $datasources.$DataSourceFolder
如果有人知道我该如何解决这个问题,我会很高兴。
我主要使用 SSRS 2008,但我确信您的问题是 overload for SetItemDataSources
is looking for a DataSource object。不仅仅是对象的路径。
$newDataSource = New-Object "$ssrsServiceNamespace.DataSource"
$newDataSource.Name = $DataSourceName
$newDataSource.Item = New-Object ("$ssrsServiceNamespace.DataSourceReference")
$newDataSource.Item.Reference = $DataSourcePath
Write-Verbose "New Datasource Name : $($newDataSource.Name)"
Write-Verbose "New Datasource Reference: $($newDataSource.Reference)"
$ReportService.SetItemDataSources($reportPath, $newDataSource)
以上代码注意事项:
$ssrsServiceNamespace.DataSource
来自连接对象。它创建一个特定于实例的 DataSource 对象。对我来说,制作一个通用的最终会导致类型转换错误,导致 SetItemDataSources()
失败。 $ReportService.Gettype().Namespace
。所以对我来说,结果是 Microsoft.PowerShell.Commands.NewWebserviceProxy.AutogeneratedTypes.WebServiceProxy1tServer_ReportService2005_asmx
并且我的方式看起来更好,理论上可以帮助我的代码在 SSRS 环境之间更具可移植性。
我有一个 PowerShell 脚本,可以为报表设置正确的数据源。
我有更多数据源,例如 DS1 和 DS2。
这是我的 PowerShell 代码的一部分:
function UpgradeReport
{
param
(
[string]$t,
[string]$ReportFolder,
[string]$ReportName,
[string]$DataSourceFolder,
[string]$IssueId
)
if([string]::IsNullOrEmpty($DataSourceFolder)) { $DataSourceFolder="DS1" }
.......
# if all ok since now, report is uploaded
# set datasource if new report
if (!$reports.$reportName) {
Write-Host $reportName ' is new. Setting data source: ' $DataSourceFolder
$Proxy.SetItemDataSources("/$reportFolder/$reportName", $datasources.$DataSourceFolder)
}
Write-Output "$(Timestamp) Finished InstallReports for $ReportName"
.....
# get list of all datasources
$Proxy.ListChildren('/Data Sources', $false) | ForEach-Object { $datasources.add($_.Name,$_ ) }
问题可能出在 SetItemDataSources
我有 $datasources.$DataSourceFolder
如果有人知道我该如何解决这个问题,我会很高兴。
我主要使用 SSRS 2008,但我确信您的问题是 overload for SetItemDataSources
is looking for a DataSource object。不仅仅是对象的路径。
$newDataSource = New-Object "$ssrsServiceNamespace.DataSource"
$newDataSource.Name = $DataSourceName
$newDataSource.Item = New-Object ("$ssrsServiceNamespace.DataSourceReference")
$newDataSource.Item.Reference = $DataSourcePath
Write-Verbose "New Datasource Name : $($newDataSource.Name)"
Write-Verbose "New Datasource Reference: $($newDataSource.Reference)"
$ReportService.SetItemDataSources($reportPath, $newDataSource)
以上代码注意事项:
$ssrsServiceNamespace.DataSource
来自连接对象。它创建一个特定于实例的 DataSource 对象。对我来说,制作一个通用的最终会导致类型转换错误,导致 SetItemDataSources()
失败。 $ReportService.Gettype().Namespace
。所以对我来说,结果是 Microsoft.PowerShell.Commands.NewWebserviceProxy.AutogeneratedTypes.WebServiceProxy1tServer_ReportService2005_asmx
并且我的方式看起来更好,理论上可以帮助我的代码在 SSRS 环境之间更具可移植性。