Crystal Report中如何传递参数

6

我正在从一个存储过程创建Crystal报表,当我传递一个参数时,这个操作很好地运行,但是当我传递两个参数时,它会显示错误

"参数不正确"

我的代码如下:

 {
    ReportDocument reportDocument = new ReportDocument();
    ParameterField paramField = new ParameterField();
    ParameterFields paramFields = new ParameterFields();
    ParameterDiscreteValue paramDiscreteValue = new ParameterDiscreteValue();

    paramField.Name = "@Dept";
    paramDiscreteValue.Value = TextBox1.Text.ToString();
    paramField.CurrentValues.Add(paramDiscreteValue);
    paramFields.Add(paramField);

    paramField.Name = "@Name";
    paramDiscreteValue.Value = TextBox2.Text.ToString();
    paramField.CurrentValues.Add(paramDiscreteValue);
    paramFields.Add(paramField);

    CrystalReportViewer1.ParameterFieldInfo = paramFields;
    reportDocument.Load(Server.MapPath("CrystalReport.rpt"));
    CrystalReportViewer1.ReportSource = reportDocument;
    reportDocument.SetDatabaseLogon("sa", "sa", "OPWFMS-7KYGZ7SB", "test");

}

请让我知道任何更改。


13
只是提供一下信息,这里的元音是自由的。 - mbillard
5个回答

9
您需要为两个参数创建新的parameterField和value。您当前的代码添加了参数,修改了它(更改名称和值),然后再次添加相同的对象。应该这样做才正确:
 {
ReportDocument reportDocument = new ReportDocument();

ParameterFields paramFields = new ParameterFields();
// ParameterDiscreteValue paramDiscreteValue = new ParameterDiscreteValue();

ParameterField paramField = new ParameterField();
ParameterDiscreteValue paramDiscreteValue = new ParameterDiscreteValue();
paramField.Name = "@Dept";
paramDiscreteValue.Value = TextBox1.Text.ToString();
paramField.CurrentValues.Add(paramDiscreteValue);
paramFields.Add(paramField);

paramField = new ParameterField(); // <-- This line is added
paramDiscreteValue = new ParameterDiscreteValue();  // <-- This line is added
paramField.Name = "@Name";
paramDiscreteValue.Value = TextBox2.Text.ToString();
paramField.CurrentValues.Add(paramDiscreteValue);
paramFields.Add(paramField);

CrystalReportViewer1.ParameterFieldInfo = paramFields;
reportDocument.Load(Server.MapPath("CrystalReport.rpt"));
CrystalReportViewer1.ReportSource = reportDocument;
reportDocument.SetDatabaseLogon("sa", "sa", "OPWFMS-7KYGZ7SB", "test");

编辑: 在评论中提到的错误可能是因为代码中有两个变量paramField或paramDiscreteValue的定义。在一个C#方法中,您不能多次定义同名变量。 请按照上面编写的代码尝试,如果您仍然收到编译器错误,请在此处粘贴完整的错误文本。


不行啊,出现了错误,提示paramField和paramDiscreteValue已经被定义过了。 - mayank
是的。ParameterDiscreteValue有两个定义。我会添加额外的注释行。 - zendar
这不是编译时错误,报告正在生成,但报告中写着“参数不正确”。 - mayank
嗨,我真的很抱歉。当我在我的代码中添加了新参数时,我以为它会直接添加到报告中,但事实并非如此。现在一切都没问题了。再次抱歉。 - mayank
你能帮我吗?我遇到了同样的问题,当我传递参数时,水晶报表无法运行,没有任何内容显示,只有一个空白屏幕。这是链接 https://stackoverflow.com/questions/59095828/why-the-crystal-report-not-appear-and-no-show。 - Abdullah
显示剩余4条评论

5

试试这个,它更为简洁

{    
  ReportDocument reportDocument = new ReportDocument();

  reportDocument.Load(Server.MapPath("CrystalReport.rpt"));
  CrystalReportViewer1.ReportSource = reportDocument;
  reportDocument.SetParameterValue("@Dept", TextBox1.Text.ToString());    
  reportDocument.SetParameterValue("@Name", TextBox2.Text.ToString());

 // CrystalReportViewer1.ParameterFieldInfo = paramFields;

  reportDocument.SetDatabaseLogon("sa", "sa", "OPWFMS-7KYGZ7SB", "test");
}

2
尝试在向报表添加每个参数之前先创建ParameterField:
paramField = new ParameterField();
paramDiscreteValue.Value = ...
...

不行啊,出现了错误,提示paramField和paramDiscreteValue已经被定义过了。 - mayank

2

确保传递给参数的实际数据没有被隐式转换为错误的数据类型。例如,如果您正在传递一个数字ID用于@Dept参数,请确保期望接收该值的输入参数的数据类型也是数字类型。


0
问题可以通过使用Visual Studio 2005的Crystal Reports进行复制。解决方法是首先设置CrystalReportViewer的ReportSource属性,然后再设置参数值。因此,您的代码应该是:
{
ReportDocument reportDocument = new ReportDocument();

CrystalReportViewer1.ReportSource = reportDocument;

ParameterField paramField = new ParameterField();
ParameterFields paramFields = new ParameterFields();
ParameterDiscreteValue paramDiscreteValue = new ParameterDiscreteValue();

paramField.Name = "@Dept";
paramDiscreteValue.Value = TextBox1.Text.ToString();
paramField.CurrentValues.Add(paramDiscreteValue);
paramFields.Add(paramField);

paramField.Name = "@Name";
paramDiscreteValue.Value = TextBox2.Text.ToString();
paramField.CurrentValues.Add(paramDiscreteValue);
paramFields.Add(paramField);

CrystalReportViewer1.ParameterFieldInfo = paramFields;
reportDocument.Load(Server.MapPath("CrystalReport.rpt"));
reportDocument.SetDatabaseLogon("sa", "sa", "OPWFMS-7KYGZ7SB", "test");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接