2017-01-21 54 views
0

編輯SSRS數據驅動訂閱:增加了整體轉換的C#來PowerShell和問題創建使用PowerShell

我想MSDN C#代碼轉換爲PowerShell腳本。 這裏的MSDN link

我幾乎完成了轉換,但我遇到了一些問題,爲我的最後一行。

這是完整的錯誤消息:使用「7」參數調用「CreateDataDrivenSubscription」的異常:「生成XML文檔時發生錯誤。」

以下是創建數據驅動訂閱中第7個參數的代碼片段。

這裏的PowerShell腳本:

$Parameters | Add-Member -type NoteProperty -Name $EMPID.ParameterName -Value $EMPID.FieldAlias 

$ReportYear = New-Object $ParameterValue 
$ReportYear.Name = "ReportYear" 
$ReportYear.Value = "2017" 

$Parameters | Add-Member -type NoteProperty -Name $ReportYear.Name -Value $ReportYear.Value 

$ReportMonth = New-Object $ParameterValue 

$ReportMonth.Name = "ReportMonth" 
$ReportMonth.Value = "6" 

$Parameters | Add-Member -Type NoteProperty -Name $ReportMonth.Name -Value $ReportMonth.Value 


$SubscriptionID = $objWebServerProxy.CreateDataDrivenSubscription($Report,$Settings,$arrDataRetrievalPlan,$Description,$EventType,$MatchData,$Parameters) 

這裏的C#代碼

ParameterValueOrFieldReference[] parameters = new ParameterValueOrFieldReference[3]; 

ParameterFieldReference empID = new ParameterFieldReference(); // Data-driven. 
empID.ParameterName = "EmpID"; 
empID.FieldAlias = "EmpID"; 
parameters[0] = empID; 

ParameterValue reportYear = new ParameterValue(); 
reportYear.Name = "ReportYear"; 
reportYear.Value = "2004"; 
parameters[1] = reportYear; 

ParameterValue reportMonth = new ParameterValue(); 
reportMonth.Name = "ReportMonth"; 
reportMonth.Value = "6"; // June 
parameters[2] = reportMonth; 

try 
{ 
    string subscriptionID = rs.CreateDataDrivenSubscription( 
report, settings, dataRetrieval, description, eventType, matchData, parameters); 

你能告訴我爲什麼我的轉換錯過?

這是我整個轉換的腳本。

$URI = "URI" 

$objWebServerProxy = New-WebServiceProxy -Uri $URI -UseDefaultCredential -ErrorAction Stop 

$Namespace = $objWebServerProxy.GetType().Namespace 
$ExtensionSettigs = ($Namespace + '.ExtensionSettings') 
$ParameterValueOrFieldReference = ($Namespace + '.ParameterValueOrFieldReference') 
$ParameterFieldReference = ($Namespace + '.ParameterFieldReference') 
$ParameterValue = ($Namespace + '.ParameterValue') 
$Datasource = ($Namespace + '.DataSource') 
$DataSourceDefinition = ($Namespace + '.DataSourceDefinition') 
$Field = ($Namespace + '.Field') 
$CredentialRetrievalEnum = ($Namespace + '.CredentialRetrievalEnum') 
$DataSetDefinition = ($Namespace + '.DataSetDefinition') 
$QueryDefinition = ($Namespace + '.QueryDefinition') 
$DataSetDefinition = ($Namespace +'.DataSetDefinition') 
$DataRetrievalPlan = ($Namespace+'.DataRetrievalPlan') 
$ScheduleReference = ($Namespace+'.ScheduleReference') 

$NameSharedSchedule="Mike_Test"; 
$NeverExpireSchedule= $objWebServerProxy.ListSchedules([System.Management.Automation.Language.NullString]::Value) | where {$_.Name -eq "$NameSharedSchedule"} 
$NeverExpireScheduleID = $NeverExpireSchedule.scheduleid; 
$NeverExpireDescription = $NeverExpireSchedule.Description; 
$NeverExpireDefinition = $NeverExpireSchedule.Definition; 
#Write-Host "Found Shared Schedule: '$NameSharedSchedule' with id $NeverExpireScheduleID and definition $NeverExpireDescription"; 

$NeverExpireScheduleRef =New-Object $ScheduleReference 
$NeverExpireScheduleRef.ScheduleID=$NeverExpireScheduleID; 

#$Report = "/ForMigration/Subscription_Test/SSRSRationalization_ExecutionLog_LastEightDays" 
$Report = "/Gayatree/GTest/ExecutionLog_LastEightDays" 
$Description = "My new Data Driven Subscription" 

$Settings = New-Object $ExtensionSettigs 

$Settings.Extension = "Report Server Email"; 

$ExtensionParams = New-Object $ParameterValueOrFieldReference 

#$ExtensionParams.ParameterValueOrFieldReference ='8' 



$To = New-Object $ParameterFieldReference 
$To.ParameterName = "TO" 
$To.FieldAlias = "Email" 

$ExtensionParams | Add-Member -type NoteProperty -name $To.ParameterName -Value $To.FieldAlias 

$ReplyTo = New-Object $ParameterValue 
$ReplyTo.Name = "ReplyTo" 
$ReplyTo.Value = "Email" 

$ExtensionParams | Add-Member -type NoteProperty -name $ReplyTo.Name -Value $ReplyTo.Value 

$IncludeReport = New-Object $ParameterValue 
$IncludeReport.Name = "IncludeReport" 
$IncludeReport.Value = $false 

$ExtensionParams | Add-Member -type NoteProperty -name $IncludeReport.Name -Value $IncludeReport.Value 

$RenderFormat = new-object $ParameterValue 
$RenderFormat.Name = "ReportFormat"; 
$RenderFormat.Value = "HTML4.0" 

$ExtensionParams | Add-Member -type NoteProperty -name $RenderFormat.Name -Value $RenderFormat.Value 

$Priority = New-Object $ParameterValue 
$Priority.Name = "Priority" 
$Priority.Value = "Normal" 

$ExtensionParams | Add-Member -type NoteProperty -name $Priority.Name -Value $Priority.Value 

$Subject = New-Object $ParameterValue 
$Subject.Name = "Subject" 
$Subject.Value = "Your sales report" 
$ExtensionParams | Add-Member -type NoteProperty -name $Subject.Name -Value $Subject.Value 

$Comment = New-Object $ParameterValue 
$Comment.Name = "Comment" 
$Comment.Value = "Here is the link to your report." 

$ExtensionParams | Add-Member -type NoteProperty -name $Comment.Name -Value $Comment.Value 

$IncludeLink = New-Object $ParameterValue 
$IncludeLink.Name = "IncludeLink"; 
$IncludeLink.Value = $true 

$ExtensionParams | Add-Member -Type NoteProperty -name $IncludeLink.Name -Value $IncludeLink.Value 

$Settings.ParameterValues = $ExtensionParams 



$DSName = New-Object $Datasource 
$DSName.Name = "Mike_Test" 

<# 
$DSDefinition = New-Object $DataSourceDefinition 
$CredentialRetrieval = New-Object $CredentialRetrievalEnum 
$CredentialRetrieval.value__ = 1 

$DSDefinition.ConnectString = "Data source = server;Initial Catalog = ReportServer" 
$DSDefinition.CredentialRetrieval = $CredentialRetrieval 
$DSDefinition.Enabled = $true 
$DSDefinition.EnabledSpecified = $true 
$DSDefinition.Extension = "SQL" 
$DSDefinition.ImpersonateUserSpecified = $false 
$DSDefinition.UserName = "Username" 
$DSDefinition.Password = "Password" 

#> 
$DS = $objWebServerProxy.ListChildren('/',$false)|Where-Object {$_.TypeName -eq "DataSource"} 

    foreach($DSS in $DS){ 
    $anotherPass = $DSS.path 
$another = $objWebServerProxy.GetDataSourceContents("$anotherPass") 
$another.Password = "TestPass" 
} 
$another 
$DSName.Item = $another 

$FieldList = New-Object $Field 
$FieldList.Name = "EmailAddress" 
$FieldList.Alias = "EmailAddress" 

$FieldList | Add-Member -Type NoteProperty -name $FieldList.Name -Value $FieldList.Alias 

$FieldList.Name = "EmpID" 
$FieldList.Alias = "EmpID" 

$FieldList | Add-Member -Type NoteProperty -name $FieldList.Name -Value $FieldList.Alias 


$DataSetDef = New-Object $DataSetDefinition 

$DataSetDef.AccentSensitivitySpecified = $false 
$DataSetDef.CaseSensitivitySpecified = $false 
$DataSetDef.KanatypeSensitivitySpecified = $false 
$DataSetDef.WidthSensitivitySpecified = $false 
$DataSetDef.Fields = $FieldList 


$arrQueryDefinition = New-Object $QueryDefinition 
$arrQueryDefinition.CommandText = "Select getdate()" 
$arrQueryDefinition.CommandType = "Text" 
$arrQueryDefinition.Timeout = '45' 
$arrQueryDefinition.TimeoutSpecified = $true 
$DataSetDef.Query = $arrQueryDefinition 
$Results = New-Object $DataSetDefinition 
$Bool = $true 
$Name = "Parameter" 
$DSDefinition 

$DataSetDef 


$DSName 
$Results = $objWebServerProxy.PrepareQuery($DSName,$DataSetDef,[ref]$Bool,[ref]$Name) 

$arrDataRetrievalPlan = New-Object $DataRetrievalPlan 
$arrDataRetrievalPlan.DataSet = $Results 
$arrDataRetrievalPlan.Item = $another 

$EventType = "TimedSubscription"; 
$MatchData = $NeverExpireScheduleID 

$Parameters = New-Object $ParameterValueOrFieldReference 
# 
$EMPID = New-Object $ParameterFieldReference 
$EMPID.ParameterName = "EmpID" 
$EMPID.FieldAlias = "EmpID" 

$Parameters | Add-Member -type NoteProperty -Name $EMPID.ParameterName -Value $EMPID.FieldAlias 

$ReportYear = New-Object $ParameterValue 
$ReportYear.Name = "ReportYear" 
$ReportYear.Value = "2017" 

$Parameters | Add-Member -type NoteProperty -Name $ReportYear.Name -Value $ReportYear.Value 

$ReportMonth = New-Object $ParameterValue 

$ReportMonth.Name = "ReportMonth" 
$ReportMonth.Value = "6" 

$Parameters | Add-Member -Type NoteProperty -Name $ReportMonth.Name -Value $ReportMonth.Value 



$SubscriptionID = $objWebServerProxy.CreateDataDrivenSubscription($Report,$Settings,$arrDataRetrievalPlan,$Description,$EventType,$MatchData,$Parameters) 

回答

0

我不知道,如果你正在創建的實例的parameterValue工作的方式 - 我不能告訴以來的$的parameterValue聲明肯定丟失,但機會是這個原因導致的問題。 你可能想嘗試更多的東西沿着這行:

$reportServerUri = "http://localhost/reportserver/ReportService2010.asmx?wsdl" 
$rs = New-WebServiceProxy -Uri $reportServerUri -UseDefaultCredential -Namespace "SSRS" 

# Note the difference, here we use the type generated when creating the webservice proxy: 
$ReportYear = New-Object SSRS.ParameterValue 
$ReportYear.Name = "ReportYear" 
$ReportYear.Value = "2017" 

見我blog post here一個快速教程。

編輯 查明其中CreateDataDrivenSubscription參數錯誤是,試圖替換一個或多個參數與$null - 當然它可能根據方法的文檔是無效的,但null檢查一次通話已經成功發生發送到服務器並反序列化。

換句話說,如果與$null取代$Parameters參數不拋出「錯誤生成XML文檔」,那麼誤差在$Parameters說法:

$SubscriptionID = $objWebServerProxy.CreateDataDrivenSubscription($Report,$Settings, 
      $arrDataRetrievalPlan,$Description,$EventType,$MatchData,$null) 
+0

是。我已經看過你的博客,因此我學習了SSRS的基本腳本。我爲此感謝你。 實際上,如果您已經編寫了類似的命名空間,就會出現問題。我通常在創建Web代理時使用自動生成的名稱空間。 \t $命名空間= $ objWebServerProxy.GetType()。命名空間 \t $ =的parameterValue($命名空間+ '.ParameterValue') ,然後用此創建一個對象,無論如何,以避免混淆我還可以添加評論的我的整個劇本。 – mdennis

+0

是的。當我將它轉換爲$ null時,它有相同的錯誤信息。 我確實有一個問題,是我在C#中對這行的轉換是否正確? 你可以參考下面我的代碼片段。 – mdennis

+0

<! - 語言:C#: - > \t ParameterValueOrFieldReference []參數=新ParameterValueOrFieldReference [3]; \t ParameterFieldReference EMPID =新ParameterFieldReference(); \t empID.ParameterName = 「的EmpID」; \t empID.FieldAlias = 「的EmpID」; \t參數[0] = EMPID; 的PowerShell: \t $ ParameterValueOrFieldReference =($命名空間+ '.ParameterValueOrFieldReference') \t $ EMPID =新對象$ ParameterFieldReference \t $ EMPID.ParameterName = 「的EmpID」 \t $ EMPID.FieldAlias = 「的EmpID」 \t $參數| Add-Member -type NoteProperty -Name $ EMPID.ParameterName -Value $ EMPID.FieldAlias – mdennis