【问题标题】:Create SSRS Data Driven Subscription using PowerShell使用 PowerShell 创建 SSRS 数据驱动订阅
【发布时间】:2017-01-21 15:27:16
【问题描述】:

编辑:将整个转换后的 c# 添加到 PowerShell 中有问题

我正在尝试将 MSDN C# 代码转换为 PowerShell 脚本。 这是 MSDN link

我几乎完成了转换,但我在最后一行遇到了一些问题。

这是完整的错误消息:使用“7”参数调用“CreateDataDrivenSubscription”的异常:“生成 XML 文档时出错。”

下面是创建数据驱动订阅的第 7 个参数的代码 sn-p。

这是 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)

【问题讨论】:

    标签: c# powershell reporting-services


    【解决方案1】:

    我不确定您创建 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 替换$Parameters 参数不会抛出“错误生成XML 文档”,那么错误就在$Parameters 参数中:

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

    【讨论】:

    • 是的。我已经看过你的博客,并因此学习了 SSRS 中的基本脚本。我感谢你。实际上,如果您这样编写命名空间,就会出现问题。我通常在创建 Web 代理时使用自动生成的命名空间。 $Namespace = $objWebServerProxy.GetType().Namespace $ParameterValue = ($Namespace + '.ParameterValue') 然后使用它创建一个对象,无论如何,为了避免混淆,我还将为我的整个脚本添加注释。
    • 是的。当我将其转换为 $null 时,它具有相同的错误消息。我确实有一个问题,我在 C# 中对这一行的转换是否正确?你可以参考下面我的代码sn-p。
    • ParameterValueOrFieldReference[] 参数 = new ParameterValueOrFieldReference[3]; ParameterFieldReference empID = new ParameterFieldReference(); empID.ParameterName = "EmpID"; empID.FieldAlias = "EmpID";参数[0] = empID; PowerShell: $ParameterValueOrFieldReference = ($Namespace + '.ParameterValueOrFieldReference') $EMPID = 新对象 $ParameterFieldReference $EMPID.ParameterName = "EmpID" $EMPID.FieldAlias = "EmpID" $Parameters | Add-Member -type NoteProperty -Name $EMPID.ParameterName -Value $EMPID.FieldAlias
    猜你喜欢
    • 2022-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    相关资源
    最近更新 更多