Visual Studio 2013中Crystal Report提示“Missing Parameter Values”求助
Crystal Reports 13 "Missing Parameter Values" 错误排查(从CR9迁移到CR13)
我维护的应用程序从Visual Studio 2010 + Crystal Reports 9迁移到VS2013,恢复备份版本时遇到问题:本地安装了CR13.0.26(32/64位),报表设计器能正常运行,但VS中运行时始终提示**"Missing Parameter Values"**错误。报表仅接收一个@ID参数,新建同版本报表也出现同样问题,推测是CR9到CR13的参数传递方式变化导致。
环境配置与代码
web.config 程序集配置
<assemblies> <add assembly="CrystalDecisions.Web, Version=13.0.4000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> <add assembly="CrystalDecisions.Shared, Version=13.0.4000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> <add assembly="CrystalDecisions.ReportSource, Version=13.0.4000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> <add assembly="CrystalDecisions.ReportAppServer.Controllers, Version=13.0.4000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> <add assembly="CrystalDecisions.ReportAppServer.DataDefModel, Version=13.0.4000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> <add assembly="CrystalDecisions.CrystalReports.Engine, Version=13.0.4000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> <add assembly="CrystalDecisions.ReportAppServer.ClientDoc, Version=13.0.4000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/> </assemblies>
.aspx页面标记
<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="REPVisitasDiariasTecnicos.aspx.cs" Inherits="REPVisitasDiariasTecnicos" %> <%@ Register TagPrefix="CR" Namespace="CrystalDecisions.Web" Assembly="CrystalDecisions.Web, Version=13.0.4000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" %> <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <div> <table style="width: 100%"> <tr> <td> <CR:CrystalReportViewer ID="CrystalReportViewer" runat="server" AutoDataBind="true" EnableDatabaseLogonPrompt="False" EnableParameterPrompt="False" ToolPanelView="None" HasToggleGroupTreeButton="False" HasToggleParameterPanelButton="False" DisplayStatusbar="False" HasCrystalLogo="False" HasDrilldownTabs="False" HasDrillUpButton="False" HasGotoPageButton="False" HasZoomFactorList="False" /> </td> </tr> </table> </div> <br /> </asp:Content>
后台代码
private void ConfigureCrystalReports() { oReport = new ReportDocument(); string reportPath; reportPath = Server.MapPath(@"report.rpt"); oReport.FileName = reportPath; // establish the connection string _connectionString = ConfigurationManager.ConnectionStrings["WEB"].ConnectionString; System.Data.SqlClient.SqlConnectionStringBuilder SConn = new System.Data.SqlClient.SqlConnectionStringBuilder(_connectionString); // establish the connection with the report ConnectionInfo connectionInfo = new ConnectionInfo() { ServerName = SConn.DataSource, DatabaseName = SConn.InitialCatalog, UserID = SConn.UserID, Password = SConn.Password }; CrystalReportViewer.ReportSource = oReport; foreach (CrystalDecisions.CrystalReports.Engine.Table t in oReport.Database.Tables) { TableLogOnInfo boTableLogOnInfo = t.LogOnInfo; boTableLogOnInfo.ConnectionInfo = connectionInfo; t.ApplyLogOnInfo(boTableLogOnInfo); } ArrayList arrayList = new ArrayList(); // Add the parameter to a List arrayList.Add(31302); ParameterFields parameterFields= CrystalReportViewer.ParameterFieldInfo; SetCurrentValuesForParameterField(parameterFields, arrayList); } private static void SetCurrentValuesForParameterField(ParameterFields parameterFields, ArrayList arrayList) { ParameterValues currentParameterValues = new ParameterValues(); int i = 0; foreach (object submittedValue in arrayList) { ParameterDiscreteValue paramValor = new ParameterDiscreteValue(); ParameterField param = parameterFields[i]; paramValor.Value = submittedValue.ToString(); param.CurrentValues.Add(paramValor); i++; } }
问题排查与修复方案
1. 参数传递依赖索引存在风险
代码中通过parameterFields[i]按索引获取参数,若报表参数顺序变化或名称不匹配,会导致参数未正确赋值。建议直接通过参数名称定位:
修改参数赋值方法:
private static void SetCurrentValuesForParameterField(ParameterFields parameterFields, string paramName, object value) { ParameterField param = parameterFields[paramName]; if (param != null) { param.CurrentValues.Clear(); // 清空原有值避免冲突 ParameterDiscreteValue paramValor = new ParameterDiscreteValue(); paramValor.Value = value; // 直接传递原始类型,不要转字符串 param.CurrentValues.Add(paramValor); } }
调用时改为:
SetCurrentValuesForParameterField(oReport.ParameterFields, "@ID", 31302);
2. 参数类型不匹配
CR13对参数类型校验比CR9严格,若报表中@ID是数值类型,代码中把31302转成字符串赋值会导致类型不匹配,需直接传递原始数值类型。
3. 调整报表加载与参数赋值顺序
当前代码先绑定报表到Viewer,再处理参数和登录信息,可能导致参数未生效。正确顺序:
- 加载报表
- 设置数据库登录信息
- 赋值参数
- 绑定到Viewer
修改后的核心代码:
private void ConfigureCrystalReports() { oReport = new ReportDocument(); string reportPath = Server.MapPath(@"report.rpt"); oReport.Load(reportPath); // 使用Load方法而非直接赋值FileName // 1. 设置数据库连接 string _connectionString = ConfigurationManager.ConnectionStrings["WEB"].ConnectionString; System.Data.SqlClient.SqlConnectionStringBuilder SConn = new System.Data.SqlClient.SqlConnectionStringBuilder(_connectionString); ConnectionInfo connectionInfo = new ConnectionInfo() { ServerName = SConn.DataSource, DatabaseName = SConn.InitialCatalog, UserID = SConn.UserID, Password = SConn.Password }; foreach (CrystalDecisions.CrystalReports.Engine.Table t in oReport.Database.Tables) { TableLogOnInfo boTableLogOnInfo = t.LogOnInfo; boTableLogOnInfo.ConnectionInfo = connectionInfo; t.ApplyLogOnInfo(boTableLogOnInfo); t.Location = t.Location; // 强制更新表连接,避免缓存旧信息 } // 2. 赋值参数 SetCurrentValuesForParameterField(oReport.ParameterFields, "@ID", 31302); // 3. 绑定到Viewer CrystalReportViewer.ReportSource = oReport; }
4. 程序集版本不匹配
安装的是CR13.0.26,但web.config引用的是13.0.4000.0版本,版本不一致会导致运行时异常。将web.config中所有Crystal程序集版本改为13.0.26.0,与安装版本保持一致。
5. 调试验证参数加载情况
添加调试代码确认报表参数是否正确加载:
foreach (ParameterField param in oReport.ParameterFields) { Debug.WriteLine($"参数名称:{param.Name},类型:{param.ParameterValueType}"); }
内容的提问来源于stack exchange,提问作者Diego
相关产品推荐
相关产品推荐

