我正在从基于ASP.NET(MVC)的应用程序生成报告服务报告,但是在设置报告的参数时遇到了问题。
我认为自从我们将SQL Server从2005升级到2008 R2(以及Reporting Services以及它)以来,问题才出现。
遇到的原始错误来自于调用rsExec.Render:
程序或功能'pCommunication_ReturnRegistrationLetterDetails' 期望参数'@guid',这是未提供的。
调试代码我注意到rsExec.SetExecutionParameters返回以下响应:
无法调用'NameOfApp.SQLRSExec.ReportExecutionService.SetExecutionParameters(NameOfApp.SQLRSExec.ParameterValue [], string)'因为它是一个web方法。
这是完整的功能:
public static bool ProduceReportToFile(string reportname, string filename, string[,] reportparams,
string fileformat)
{
bool successful = false;
SQLRS.ReportingService2005 rs = new SQLRS.ReportingService2005();
SQLRSExec.ReportExecutionService rsExec = new NameOfApp.SQLRSExec.ReportExecutionService();
rs.Credentials = System.Net.CredentialCache.DefaultCredentials;
rsExec.Credentials = System.Net.CredentialCache.DefaultCredentials;
// Prepare Render arguments
string historyID = null;
string deviceInfo = null;
// Prepare format - available options are "PDF","Word","CSV","TIFF","XML","EXCEL"
string format = fileformat;
Byte[] results;
string encoding = String.Empty;
string mimeType = String.Empty;
string extension = String.Empty;
SQLRSExec.Warning[] warnings = null;
string[] streamIDs = null;
// Define variables needed for GetParameters() method
// Get the report name
string _reportName = reportname;
string _historyID = null;
bool _forRendering = false;
SQLRS.ParameterValue[] _values = null;
SQLRS.DataSourceCredentials[] _credentials = null;
SQLRS.ReportParameter[] _parameters = null;
// Get if any parameters needed.
_parameters = rs.GetReportParameters(_reportName, _historyID,
_forRendering, _values, _credentials);
// Load the selected report.
SQLRSExec.ExecutionInfo ei =
rsExec.LoadReport(_reportName, historyID);
// Prepare report parameter.
// Set the parameters for the report needed.
SQLRSExec.ParameterValue[] parameters =
new SQLRSExec.ParameterValue[1];
// Place to include the parameter.
if (_parameters.Length > 0)
{
for (int i = 0; i < _parameters.Length; i++)
{
parameters[i] = new SQLRSExec.ParameterValue();
parameters[i].Label = reportparams[i,0];
parameters[i].Name = reportparams[i, 0];
parameters[i].Value = reportparams[i, 1];
}
}
rsExec.SetExecutionParameters(parameters, "en-us");
results = rsExec.Render(format, deviceInfo,
out extension, out encoding,
out mimeType, out warnings, out streamIDs);
// Create a file stream and write the report to it
using (FileStream stream = System.IO.File.OpenWrite(filename))
{
stream.Write(results, 0, results.Length);
}
successful = true;
return successful;
}
为什么我现在无法设置参数的任何想法?如果不需要参数,报告生成工作没有问题。
答案 0 :(得分:0)
看起来这可能是报告服务如何将参数传递给提供数据的存储过程的问题。字符串guid正在传递给报告,存储过程需要一个varchar guid。我怀疑报告服务可能已经注意到guid格式模式后面的字符串,因此将其作为uniqueidentifier传递给存储过程。
我将报告的数据源从“存储过程”更改为“文本”,并将SQL设置为“EXEC pMyStoredOProcName @guid”。
请注意guid作为字符串传递给存储过程可能不是最佳做法...我只是用另一个开发人员代码调试问题。
答案 1 :(得分:0)
参数_reportName
不能为null或为空。 [CLASSNAME].[METHODNAME]()
反射API无法创建并返回SrsReportNameAttribute
对象
在这种特定情况下,看起来早期的完整编译没有完成。
如果您遇到此问题,我建议您首先编译错误消息中提到的类,看看是否能解决问题。
转到AOT(获取Ctrl + D)
找到CLASSNAME
3.编译它(F7)