You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,再处理参数和登录信息,可能导致参数未生效。正确顺序:

  1. 加载报表
  2. 设置数据库登录信息
  3. 赋值参数
  4. 绑定到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 21:45:54