我一直在将一个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小时后工作……!
在我的情况下,它终于在战斗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] 举报,一经查实,本站将立刻删除。