我正在尝试使用带有MSSQL 2012后端的SSRS 2012服务器上的ReportExecution2005.asmx服务端点将报告呈现为PDF。当我在Web服务上调用Render方法时,出现以下错误: 为'snapshotID'提供的参数值与参数类型不匹配。 ---> Microsoft.ReportingServices.Diagnostics.Utilities.ParameterTypeMismatchException:为“snapshotID”提供的参数值与参数类型不匹配。 ---> System.FormatException:String未被识别为有效的DateTime
我尝试呈现的任何报告都出现此错误,snapshotID不是报告中的参数,并且检查报告的配置,它们未设置为缓存或使用快照。我们刚刚从MSSQL 2005迁移到2012,使用带有SSRS和SQL 2005的ReportExecution2005端点我从未看到过这个错误,它工作正常。我已经尝试将snapshotID添加为具有不同值的参数,例如空字符串,当前时间等,但这显然不是它正在寻找的内容。下面是我用来设置和调用服务上的Render方法的代码。在我的情况下,pstrExportFormat将是“PDF”
Public Function ExportReport(pstrReportPath As String, plstParams As List(Of ReportParameter), pstrExportFormat As String) As Byte()
Dim lResults() As Byte = Nothing
Dim lstrSessionId As String
Dim execInfo As New reporting.ExecutionInfo
Dim execHeader As New reporting.ExecutionHeader
Dim lstrHistoryId As String = String.Empty
Try
Dim rs As New reporting.ReportExecutionService
Dim deviceInfo As String = "<DeviceInfo><PageHeight>8.5in</PageHeight><PageWidth>11in</PageWidth><MarginLeft>0.25in</MarginLeft><MarginRight>0.25in</MarginRight><MarginTop>0.25in</MarginTop><MarginBottom>0.25in</MarginBottom></DeviceInfo>"
rs.Credentials = System.Net.CredentialCache.DefaultCredentials
Dim params As New List(Of reporting.ParameterValue)
Dim param As reporting.ParameterValue
rs.Credentials = System.Net.CredentialCache.DefaultCredentials
For Each lInputParam In plstParams
param = New reporting.ParameterValue
param.Name = lInputParam.Name
param.Value = lInputParam.Value
params.Add(param)
Next
rs.ExecutionHeaderValue = execHeader
execInfo = rs.LoadReport(pstrReportPath, lstrHistoryId)
rs.SetExecutionParameters(params.ToArray, "en-us")
lResults = rs.Render(pstrExportFormat, deviceInfo, "", "", "", Nothing, Nothing)
Catch ex As Exception
Throw
End Try
Return lResults
结束功能
一些其他信息,此代码来自VS 2012 Pro中内置的应用程序,并以.NET 2.0框架为目标。我已经尝试定位一个较新的框架,但这给了我一个不同的ReportExecutionService对象,我无法以相同的方式分配凭据,在这种情况下Render方法也不同。
有关变通方法的任何想法,还是以编程方式呈现报告的更好方法?感谢。
答案 0 :(得分:13)
我今天遇到了同样的问题并且发现在LoadReport方法中,您要确保HistoryID的值为Nothing(C#中为null)。现在,你用一个空字符串传入它 - 将声明更改为
Dim lstrHistoryId As String = Nothing
或者将方法调用更改为
rs.LoadReport(pstrReportPath, Nothing)