[英]Passing GUID through C# as parameter to Crystal Reports throws an error
[英]c# passing parameters to crystal reports error “Missing Parameter Values”
我一直在將一個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, 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
skalka:s解決方案適合我,但我沒有任何SubReports
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.