2012-02-07 10 views
8

Sto provando a modificare le origini dati di più report SSRS con PowerShell a un'origine dati condivisa sul mio server di report. Ecco il mio codice:Cambia origine dati del report SSRS con PowerShell

cls; 
$reportserver = "myServer";<br/> 
$url = "http://$($reportserver)/reportserver/reportservice2005.asmx?WSDL";";<br/> 
$ssrs = New-WebServiceProxy -uri $url -UseDefaultCredential -Namespace "ReportingWebService"; 

[ReportingWebService.DataSource[]] $myDataSource = new-object ReportingWebService.DataSource 
$myDataSource[0].Name = "myDS"";<br/> 
$myDataSource[0].Item = New-Object ReportingWebService.DataSourceReference<br/> 
$myDataSource[0].Item.Reference = "/Data Sources/MyDS"<br/> 

$reports = $ssrs.ListChildren('/DH', $false) 

$reports | ForEach-Object {<br/> 
$reportPath = $_.path<br/> 
Write-Host "Report: " $reportPath<br/> 
$dataSources = $ssrs.GetItemDataSources($reportPath)<br/> 
$dataSources | ForEach-Object {<br/> 
       Write-Host "Old source: $($_.Name), $($_.Item.ConnectString)"<br/> 
       $ssrs.SetItemDataSources($reportPath, $myDataSource)<br/> 
       Write-Host "New source: $($_.Name), $($_.Item.ConnectString)"<br/> 
      }<br/> 

Write-Host "------------------------" 
} 

Ma sto ottenendo il seguente errore quando si chiama "SetItemDataSources" -Metodo:

***Argument "1" having the value "ReportingWebService.DataSource[]" of "SetItemDataSources" can not be converted to type "ReportingWebService.DataSource[]".*** 

La domanda è: cosa c'è che non va? I tipi sono gli STESSI!

risposta

12

Grazie e82.eric!

mi hai portato alla soluzione di lavoro. Eccolo:

cls; 

#Set variables: 
$reportserver = "myServer"; 
$newDataSourcePath = "/Data Sources/MyDS" 
$newDataSourceName = "MyDS"; 
$reportFolderPath = "/DH" 
#------------------------------------------------------------------------ 

$ssrs = New-WebServiceProxy -uri $url -UseDefaultCredential 

$reports = $ssrs.ListChildren($reportFolderPath, $false) 

$reports | ForEach-Object { 
      $reportPath = $_.path 
      Write-Host "Report: " $reportPath 
      $dataSources = $ssrs.GetItemDataSources($reportPath) 
      $dataSources | ForEach-Object { 
          $proxyNamespace = $_.GetType().Namespace 
          $myDataSource = New-Object ("$proxyNamespace.DataSource") 
          $myDataSource.Name = $newDataSourceName 
          $myDataSource.Item = New-Object ("$proxyNamespace.DataSourceReference") 
          $myDataSource.Item.Reference = $newDataSourcePath 

          $_.item = $myDataSource.Item 

          $ssrs.SetItemDataSources($reportPath, $_) 

          Write-Host "Report's DataSource Reference ($($_.Name)): $($_.Item.Reference)" 
          } 

      Write-Host "------------------------" 
      } 
+0

mi potete aiutare su questo http://stackoverflow.com/questions/41824616/ssrs-setitemdatasource-giving-exception – Learner

10

Avevo lo stesso problema.

Non è una soluzione eccezionale ma secondo http://www.vistax64.com/powershell/273120-bug-when-using-namespace-parameter-new-webserviceproxy.html. Il parametro namespace di New-WebServiceProxy è in qualche modo rotto. Il post suggerisce di utilizzare lo spazio dei nomi generato automaticamente che ha funzionato per me quindi penso che potresti farlo.

$reportserver = "myServer" 
$url = "http://$($reportserver)/reportserver/reportservice2005.asmx?WSDL" 
$ssrs = New-WebServiceProxy -uri $url -UseDefaultCredential 

$proxyNamespace = $ssrs.GetType().Namespace 

$myDataSource = New-Object ("$proxyNamespace.DataSource") 
$myDataSource[0].Name = "myDS" 
$myDataSource[0].Item = New-Object ("$proxyNamespace.DataSourceReference") 
$myDataSource[0].Item.Reference = "/Data Sources/MyDS" 

$reports = $ssrs.ListChildren('/DH', $false) 

$reports | ForEach-Object { 
$reportPath = $.path 
Write-Host "Report: " $reportPath 
$dataSources = $ssrs.GetItemDataSources($reportPath) 
$dataSources | ForEach-Object { 
Write-Host "Old source: $($.Name), $($.Item.ConnectString)" 
$ssrs.SetItemDataSources($reportPath, @($myDataSource)) 
Write-Host "New source: $($.Name), $($_.Item.ConnectString)" 
} 

Write-Host "------------------------" } 
+0

buona idea! ora l'errore è diverso: "L'origine dati 'myDS' non può essere trovata". È strano: so che questa origine dati esiste! :( – eghetto

+0

Grazie e82.eric postato soluzione di lavoro di seguito: – eghetto

+0

ricevo errore: proprietà 'Nome' non può essere trovato su questo oggetto; assicurarsi che esiste ed è impostabile $ MyDataSource è Microsoft.PowerShell.Commands!.. NewWebserviceProxy.AutogeneratedTypes.WebServiceProxy1NG_ReportService2005_asmx_WSDL.DataSource credo sia $ myDataSource.Name. – Kiquenet

4
+1

qualsiasi versione senza uso Sharepoint, solo SSRS? Per me non riesce in "get-spweb". – Kiquenet

+0

IvanJ grazie per gli script. Ha salvato il bacon e ha funzionato reat. @Kiquenet Assicurarsi che si stia eseguendo da una Shell di gestione SharePoint o che sia installato lo snap-in di PowerShell di SharePoint. – HAL9256

+0

Errore di sotto per SP2013 "Eccezione chiamata" GetItemDataSources "con argomento" 1 ":" Le autorizzazioni concesse all'utente "AUTHORITY NT \ ANONYMOUS LOGON" non sono sufficienti per eseguire questa operazione. --->" –