微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c#将参数传递给crystal报告错误“缺少参数值”

我一直在将一个VB应用移植到C#.除了这个之外,所有水晶报告都有效我已经调试,验证了参数名称,并按照我在这里找到的信息.无论我尝试过什么,我都会收到错误“缺少参数值”.当我尝试ExportToStream(ExportFormatType.PortableDocFormat)并另存为PDF时,会发生错误.参数都是字符串.当我调试时,6个未链接的参数中的每一个都在rptParams.ContainsKey(def.name)块内部命中.有7个子报告只有链接参数.

我在设置参数之前设置数据源.

我试过了:

ParameterFieldDeFinitions parmFields = rpt.DataDeFinition.ParameterFields;
ParameterValues pvals = new ParameterValues();
foreach (ParameterFieldDeFinition def in parmFields)
{
    if (!def.IsLinked() && rptParams.ContainsKey(def.Name))
    {
        ParameterdiscreteValue pval = new ParameterdiscreteValue();
        pval.Value = rptParams[def.Name];
        pvals.Add(pval);
        def.ApplyCurrentValues(pvals);
    }
}

这是基于原始的VB代码

Dim paramFieldDefs As ParameterFieldDeFinitions
Dim paramFieldDef As ParameterFieldDeFinition
Dim paramVal As ParameterdiscreteValue
Dim paramVals As New ParameterValues
Dim colStepRepParams As Hashtable
colStepRepParams = cStep.ReportParams

' CREATE A NEW ParaMETERS COLLECTION
paramFieldDefs = rptReport.DataDeFinition.ParameterFields()
For Each paramFieldDef In paramFieldDefs
    ' IF EXCLUDES 'ParaMETERS' WHICH LINK MAIN REPORT TO SUB REPORTS
    If Not paramFieldDef.IsLinked Then
        If colStepRepParams.ContainsKey(paramFieldDef.Name) Then
            paramVal = New CrystalDecisions.Shared.ParameterdiscreteValue
            paramVal.Value = colStepRepParams.Item(paramFieldDef.Name)
            paramVals.Add(paramVal)
            paramFieldDef.ApplyCurrentValues(paramVals)
        End If
    End If
Next paramFieldDef

我也尝试过:

foreach (ParameterFieldDeFinition def in parmFields)
{
    if (!def.IsLinked() && rptParams.ContainsKey(def.Name))
    {
        rpt.SetParameterValue(def.Name,rptParams[def.Name]);
    }
}

这是事情的顺序:

using (sqlCommand cmd = new sqlCommand(job.sproc,con))
{
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandTimeout = 600; //10 min
    foreach (keyvaluePair<string,string> p in sprParams)
    {
        cmd.Parameters.AddWithValue(p.Key,p.Value);
    }

    sqlDataAdapter da = new sqlDataAdapter(cmd);
    DataSet ds = new DataSet();
    da.Fill(ds);

    ReportDocument rpt = new ReportDocument();
    rpt.Load(Path.Combine(RPT_LOCATION,job.repFileName));
    rpt.Database.Tables[0].SetDataSource(ds.Tables[0]);

    int i = 1;
    foreach (string subReport in job.subReports)
    {
        using (ReportDocument srpt = rpt.OpenSubreport(subReport))
        {
            srpt.SetDataSource(ds.Tables[i++]);
        }

    }
    ParameterFieldDeFinitions parmFields = rpt.DataDeFinition.ParameterFields;
    ParameterValues pvals = new ParameterValues();
    foreach (ParameterFieldDeFinition def in parmFields)
    {
        if (!def.IsLinked() && rptParams.ContainsKey(def.Name))
        {
            ParameterdiscreteValue pval = new ParameterdiscreteValue();
            pval.Value = rptParams[def.Name];
            pvals.Add(pval);
            def.ApplyCurrentValues(pvals);
        }
    }
}

解决方法

这是我的解决方案部分基于你的…
在我的情况下,它终于在战斗8小时后工作……!

///BEFORE setting DB connection 

ParameterFieldDeFinitions parmFields = cr.DataDeFinition.ParameterFields;
foreach (ParameterFieldDeFinition def in parmFields)
{
   if (!def.IsLinked() )
     {

     switch (def.ValueType)
     {
           case CrystalDecisions.Shared.FieldValueType.StringField:
              cr.SetParameterValue(def.Name,"",def.ReportName);
              break;

           case CrystalDecisions.Shared.FieldValueType.NumberField:
              cr.SetParameterValue(def.Name,def.ReportName);
              break;

           default:
              cr.SetParameterValue(def.Name,null,def.ReportName);
              break;
     }

    }
}
///Now set DB connections 
 ...

///Now set all parameters which INDEED HAVE to be set ...
 ...

招呼SK

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐