65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.89/5 (24投票s)

2005年4月20日

2分钟阅读

viewsIcon

293162

downloadIcon

4858

一篇关于如何在 C# 中加载 Crystal Report 报告的文章。

引言

本文重点介绍在 C# 中加载 Crystal Report 报告。这里创建的 Crystal Report 报告使用 SQL Server 存储过程,该存储过程接受两个参数,并使用 DSN 进行 SQL Server 身份验证。

背景

当我开始使用 Crystal Reports 时,我主要困惑于以下问题:

  1. 如何使用 Crystal 的 API 从 C# 代码设置存储过程的参数。
  2. 如何避免在使用 DSN 进行 SQL Server 身份验证时弹出的窗口。
  3. 如何避免这些错误:
    • 缺少提示单元
    • 参数不正确

本文提供了上述所有问题的解决方案,并提供了一些注意事项以避免不可预测的结果。

使用代码

这里附带的代码加载了“SalseReport.rpt”文件。运行附带应用程序的步骤如下:

  1. 在 SQL Server 中创建一个名为“testDB”的数据库,并在 SQL Server 查询分析器中执行脚本“SalseData_Table_SP.sql”,这将为您创建一个名为“Sel_SalesData”的存储过程和一个名为“SalesData”的表。
  2. 将示例数据从文件“SalesData_Data.txt”(数据以逗号分隔)导入到表“salseData”。
  3. 创建一个名为“TestDB_DSN”的 DSN,使用 SQL Server 身份验证。提供有效的用户名和密码。
  4. 打开“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);
  5. 如果您创建的 DSN 名称不是“TestDB_DSN”,则从Reports目录打开“SalseReport.rpt”文件,并将数据源位置设置为指向正确的 DSN 和存储过程“Sel_SalseData”再次。
  6. 加载报告的代码如下所示:
    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;
    }

关注点

  1. 错误 - 缺少提示单元:

    当我没有为每个输入参数创建一个新的“ParameterField”对象时,我遇到了此错误。

  2. 错误 - 参数不正确:

    当我使用 paramField.Name = "vDepartment"; 而不是 paramField.Name = "@vDepartment"; 时,我遇到了此错误。这是因为在报告中,字段资源管理器中的参数字段名称是 @vDepartment。因此,请记住在 C# 代码中使用报告中使用的确切名称(对于参数/输入字段)。

  3. 注意:

    请记得在 Crystal Reports 文件菜单下取消选中“保存数据与报告”选项。在 C# 表单中调用报告时,选中此选项会导致不可预测的结果。

© . All rights reserved.