2013-09-25 59 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