我正在将一个VB应用程序移植到C#。除了这个报表,所有的水晶报表都能正常工作。我已经进行了调试,验证了参数名称,并按照在这里找到的信息进行了操作。无论我尝试什么,都会出现“缺少参数值”的错误。当我尝试导出为PDF并保存时,就会发生此错误,而且参数都是字符串类型。当我进行调试时,6个未链接的参数都会进入“rptParams.ContainsKey(def.name)”块内。还有7个子报表只有链接参数。
我设置参数之前已经设置了数据源。
我已经尝试过:
这是基于原始VB代码的:
我也尝试了以下方法:
我设置参数之前已经设置了数据源。
我已经尝试过:
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);
}
}
}