在 C# 中加载使用存储过程的 Crystal Report 报表






3.89/5 (24投票s)
2005年4月20日
2分钟阅读

293162

4858
一篇关于如何在 C# 中加载 Crystal Report 报告的文章。
引言
本文重点介绍在 C# 中加载 Crystal Report 报告。这里创建的 Crystal Report 报告使用 SQL Server 存储过程,该存储过程接受两个参数,并使用 DSN 进行 SQL Server 身份验证。
背景
当我开始使用 Crystal Reports 时,我主要困惑于以下问题:
- 如何使用 Crystal 的 API 从 C# 代码设置存储过程的参数。
- 如何避免在使用 DSN 进行 SQL Server 身份验证时弹出的窗口。
- 如何避免这些错误:
- 缺少提示单元
- 参数不正确
本文提供了上述所有问题的解决方案,并提供了一些注意事项以避免不可预测的结果。
使用代码
这里附带的代码加载了“SalseReport.rpt”文件。运行附带应用程序的步骤如下:
- 在 SQL Server 中创建一个名为“testDB”的数据库,并在 SQL Server 查询分析器中执行脚本“SalseData_Table_SP.sql”,这将为您创建一个名为“Sel_SalesData”的存储过程和一个名为“SalesData”的表。
- 将示例数据从文件“SalesData_Data.txt”(数据以逗号分隔)导入到表“salseData”。
- 创建一个名为“TestDB_DSN”的 DSN,使用 SQL Server 身份验证。提供有效的用户名和密码。
- 打开“frmSalseData.cs”文件,并在函数“
btnPreview_Click
”中更新以下行,以提供您的登录信息。//The parameters are in the order //- UserName, Password, DSN Name, DatabaseName, Case Sensitive reportDocument.SetDatabaseLogon("pchitriv", "Windows2000", "TestDB_DSN", "testDB", false);
- 如果您创建的 DSN 名称不是“TestDB_DSN”,则从Reports目录打开“SalseReport.rpt”文件,并将数据源位置设置为指向正确的 DSN 和存储过程“Sel_SalseData”再次。
- 加载报告的代码如下所示:
private void btnPreview_Click(object sender, System.EventArgs e) { //Instantiate variables ReportDocument reportDocument = new ReportDocument(); ParameterField paramField = new ParameterField(); ParameterFields paramFields = new ParameterFields(); ParameterDiscreteValue paramDiscreteValue = new ParameterDiscreteValue(); //Set instances for input parameter 1 - @vDepartment paramField.Name = "@vDepartment"; //Below variable can be set to any data //present in SalseData table, Department column paramDiscreteValue.Value = "South"; paramField.CurrentValues.Add(paramDiscreteValue); //Add the paramField to paramFields paramFields.Add(paramField); //Set instances for input parameter 2 - @iSalseYear //*Remember to reconstruct the paramDiscreteValue and paramField objects paramField = new ParameterField(); paramField.Name = "@iSalesYear"; paramDiscreteValue = new ParameterDiscreteValue(); paramDiscreteValue.Value = "2004"; paramField.CurrentValues.Add(paramDiscreteValue); //Add the paramField to paramFields paramFields.Add(paramField); crystalReportViewer1.ParameterFieldInfo = paramFields; reportDocument.Load(@"..\..\..\Reports\SalseReport.rpt"); //set the database loggon information. //**Note that the third parameter is the DSN name // and not the Database or System name reportDocument.SetDatabaseLogon("pchitriv", "Windows2000", "TestDB_DSN", "testDB", false); //Load the report by setting the report source crystalReportViewer1.ReportSource = reportDocument; }
关注点
- 错误 - 缺少提示单元:
当我没有为每个输入参数创建一个新的“
ParameterField
”对象时,我遇到了此错误。 - 错误 - 参数不正确:
当我使用
paramField.Name = "vDepartment";
而不是paramField.Name = "@vDepartment";
时,我遇到了此错误。这是因为在报告中,字段资源管理器中的参数字段名称是@vDepartment
。因此,请记住在 C# 代码中使用报告中使用的确切名称(对于参数/输入字段)。 - 注意:
请记得在 Crystal Reports 文件菜单下取消选中“保存数据与报告”选项。在 C# 表单中调用报告时,选中此选项会导致不可预测的结果。