【发布时间】:2014-11-18 18:17:43
【问题描述】:
我可以毫无问题地将单值参数传递给报告服务。但是我无法弄清楚如何将多值字符串参数发送到报告。在我的报告中,名为“multival”的字段设置为“允许多个值”。 documentation 状态传递 string[] 以获得多个值。我只是无法在 PowerShell 中获得适用于此的语法。下面是一些示例代码。
$multiVal = @('item1','item2','item5','item7');
....
$params[0] = new-Object Microsoft.Reporting.WinForms.ReportParameter("multival", $multiVal, $false);
我花了很多时间搜索互联网,但找不到任何 PowerShell 特定示例来说明如何完成此操作。非常感谢任何帮助。
更新 #1
下面是更完整的示例和错误消息的完整输出。
# Function to save each report as a PDF file
function Generate-Report
{
Param ($param1, $param2, $param3, $startdate, $enddate)
# Create a report viewer
$rv = New-Object Microsoft.Reporting.WinForms.ReportViewer;
$rv.ServerReport.ReportServerUrl = "http://myserver/reportserver";
$rv.ServerReport.ReportPath = "/Folder/Folder/Report";
$rv.ProcessingMode = [Microsoft.Reporting.WinForms.ProcessingMode]::Remote;
$rv.ShowParameterPrompts = $false;
# Need these variables for PDF rendering
$deviceInfo = $null;
$mimeType = $null;
$encoding = $null;
$extension = $null;
$streamids = $null;
$warnings = $null;
$multival = @('item1','item2','item4','item5','item8','item10'); # This does not work
#$multival = @('item1'); # This works
# Set Parameters
$params = $null;
$params = New-Object 'Microsoft.Reporting.WinForms.ReportParameter[]' 5
$params[0] = New-Object Microsoft.Reporting.WinForms.ReportParameter("startdate", $startdate, $false);
$params[1] = New-Object Microsoft.Reporting.WinForms.ReportParameter("enddate", $enddate, $false);
$params[2] = New-Object Microsoft.Reporting.WinForms.ReportParameter("param1", $param1, $false);
$params[3] = New-Object Microsoft.Reporting.WinForms.ReportParameter("param3", $param3, $false);
$params[4] = New-Object Microsoft.Reporting.WinForms.ReportParameter("multival", $multival, $false);
$rv.ServerReport.SetParameters($params);
$rv.ServerReport.Refresh();
# Render the report as PDF
$bytes = $null;
$bytes = $rv.ServerReport.Render("PDF", $deviceInfo,
[ref] $mimeType,
[ref] $encoding,
[ref] $extension,
[ref] $streamids,
[ref] $warnings);
# Save the PDF file to the designated location
$file = "$outputFolder\$param1 - $param2.pdf";
$fileStream = New-Object System.IO.FileStream($file, [IO.FileMode]::OpenOrCreate, [IO.FileAccess]::Write, [IO.FileShare]::None)
$fileStream.Write($bytes, 0, $bytes.Length);
$fileStream.Close();
}
错误如下:
Exception calling "Render" with "7" argument(s): "This report requires a default or
user-define value for the report parameter 'multival'. To run or subscribe to this
report, you must provide a parameter value. (rsReportParameterValueNotSet)"
At C:\MyScript.ps1:85 char:37
+ $bytes = $rv.ServerReport.Render <<<< ("PDF", $deviceInfo,
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
Exception calling "Write" with "3" argument(s): "Buffer cannot be null. Parameter
name: array"
At C:\MyScript.ps1:95 char:22
+ $fileStream.Write <<<< ($bytes, 0, $bytes.Length);
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
更新 #2
正如 cmets 中所指出的,我需要将 $multival 声明为 StringCollection。一旦我这样做了,代码就起作用了。请参阅下面更新的 sn-p。
$multival = New-Object System.Collections.Specialized.StringCollection
$ret = $multival.Add('item1')
$ret = $multival.Add('item2')
$ret = $multival.Add('item4')
$ret = $multival.Add('item5')
$ret = $multival.Add('item8')
$ret = $multival.Add('item10')
【问题讨论】:
-
string[] 仅表示字符串数组。只需传递这样的内容:('item', 'item2')。实际上你正在这样做 - 我不明白为什么你的例子不起作用。
-
@Swonkie - 是的,我同意并尝试过,但它就是不喜欢。如果我传入 ('item1') 就可以正常工作。但是 ('item1', 'item2') 将不起作用,我在“multival”上得到 rsReportParameterValueNotSet。 - 刚刚看到您编辑的评论。感谢您的尝试。
-
好吧,这对我有用:New-Object Microsoft.Reporting.WinForms.ReportParameter("multival", ('foo', 'bar'), $false) 这不是命令,是别的你的环境一定是错误的。
-
@Swonkie - 谢谢。我将进一步研究我的其余代码。当我看到 ('item1') 会起作用时,我就彻底崩溃了。
-
尝试分散数组:
ReportParameter("multival', @multival, $false)
标签: powershell reporting-services