2013-09-25 61 views
4

我一直在向C#移植一个VB应用程序。除此之外,所有水晶报告均可使用。我已经调试过,验证了参数名称,并且遵循了我在这里找到的信息。无论我尝试过什么,我都会收到错误“Missing Parameter Values”。当我尝试ExportToStream(ExportFormatType.PortableDocFormat)并保存为PDF时,会发生错误。参数都是字符串。当我调试时,6个未链接的参数中的每一个都会在rptParams.ContainsKey(def.name)块内命中。有7个子报表只有链接参数。c#将参数传递给水晶报告错误“缺少参数值”

我正在设置数据源之前设置参数。

我曾尝试:

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代码:

我也试过:

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); 
     } 
    } 
} 
+0

只是一个更新:回来这一点,靠墙打我的头连续几天仍然没有解决办法。 – kyle

回答

1

这里是我的解决方案部分基于你的... 在我的情况下,它终于打在8h后,工作...!

///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, 0, 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

0

skalka:■解决方案为我,但我没有任何子报表

foreach (ParameterFieldDefinition def in doc.DataDefinition.ParameterFields) 
     { 
      if (!def.IsLinked()) 
      { 

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

        case CrystalDecisions.Shared.FieldValueType.NumberField: 
         doc.SetParameterValue(def.Name, 0); 
         break; 

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

      } 
     } 

     doc.SetDataSource(table); 

// Set parameters as I wanted from the beginning