代码之家  ›  专栏  ›  技术社区  ›  BlueRaja - Danny Pflughoeft

如何用SQL填充Crystal报表

  •  4
  • BlueRaja - Danny Pflughoeft  · 技术社区  · 14 年前

    由于在.Net中似乎没有任何方法加载旧的VB6(ActiveReports)报表,因此我需要在.Net中重新创建几十个报表。我想以最不痛苦的方式来做这件事。

    在VB6中,最初的作者只是对每个报表执行如下操作:

    adoConn.ConnectionString = globalConnectionObject.ConnectionString
    adoConn.Source = ReportFunctions.GetAllUsers()
    

    GetAllUsers()


    如何在.Net中执行类似的操作 (使用内置的Crystal Reports或 “Microsoft报告技术”

    我无法让“数据库专家”识别 globalConnectionObject (ADODB.Connection对象);如果我填充一个数据集

    report.SetDataSource(dataSet)
    

    如何填充Crystal Reports!? (编译时连接字符串/数据位置未知)

    2 回复  |  直到 14 年前
        1
  •  2
  •   user240141 user240141    14 年前

    正在创建连接:

    /// <summary>
    /// Sets the connection.
    /// </summary>
    public void SetConnection()
    {
        _connection = new SqlConnection(Settings.Default.connectionString);
        if (_connection.State == System.Data.ConnectionState.Open)
        {
            _connection.Close();
        }
        _connection.Open();
    }
    
    /// <summary>
    /// Closes the connection.
    /// </summary>
    public void CloseConnection()
    {
        if (_connection.State == System.Data.ConnectionState.Open)
        {
            _connection.Close();
            _connection.Dispose();
        }
    }
    

    使用上述连接手动填充数据集或将数据集添加到解决方案中以获取数据,而无需编写连接代码。假设您添加了Employee.XSD。在XSD中添加一个tableadapter,它将通过自动生成查询和datatables来帮助您从数据库中提取数据。做了这些事之后。在你的项目中创建一个方法,

    Public DataTable GetAllEmployees()
    {
        Employee.EmployeeTableAdapter adapt = New Employee.EmployeeTableAdapter();
        DataTable dt = New DataTable();
        dt =    adapt.GetData();   // you can also use fill based on your criteria.
        return dt;   //your datatable with data
    }
    

    现在在窗体上添加一个reportviewer控件。

    ReportViewer1 rpt = New ReportViewer();
    ReportDocument rptDoc = new ReportDocument();
    rptDoc.Load("path of rpt file");
    rptDoc.SetDataSource(GetAllEmployees());
    rpt.Document =  rptDoc;
    rpt.Refresh();
    

    在Crystal Report之前,请根据您的要求在报表中添加表的字段。

    另一种实现方法

    水晶报表可以用于各种对象。如果您有动态绑定它的场景,请参阅下面我的答案,然后您可以做一件事,即向解决方案添加一个新的数据集。创建一个datatable并添加具有适当数据类型的必需列。不要添加查询或表适配器。现在从代码中添加一个类文件并创建与datatable列完全相似的属性。现在将datatable设置为要报告的源,并在报告中添加其列。

    For example , if you have columns
    ID - integer
    EmpName - string
    Salary - double
    Department - string
    

    创建一个类

    public class Employee
    {
      private SqlConnection _connection;
      public int ID {get;set;}
      public string EmpName {get;set;}
      public double Salary {get;set;}
      public string Department  {get;set;}
    
    
    
    /// <summary>
    /// Sets the connection.
    /// </summary>
    public void SetConnection()
    {
        //assuming connection string is placed in settings file from Project Properties.
        _connection = new SqlConnection(Settings.Default.connectionString);
        if (_connection.State == System.Data.ConnectionState.Open)
        {
            _connection.Close();
        }
        _connection.Open();
    }
    
    /// <summary>
    /// Closes the connection.
    /// </summary>
    public void CloseConnection()
    {
        if (_connection.State == System.Data.ConnectionState.Open)
        {
            _connection.Close();
            _connection.Dispose();
        }
    }
    
    
      public DataTable GetEmployees()
      {
           DataTable dt = new DataTable("Employee");
           // using above connection
           SetConnection();
          using(SqlCommand command = new SqlCOmmand("commandText",_connection))
          {
             using(SqlDataReader reader = command.ExecuteReader())
             {
                  dt.Load(reader);
             }
          }
           return dt;
      }
    }
    

    现在创建另一个函数来填充在dtataset中创建的datatable。

    public void PopulateDataTable()
    {
          DataTable dt = GetEmployee();
          Employee dsEmployee = New DataSet();
          dsEmployee.EmployeeDataTable dtEmp = new dsEmployee.EmployeeDataTable();
          dtEmp = dt;
    }
    
        2
  •  0
  •   sgriffinusa    14 年前

    我们使用Crystal Reports做了类似的事情,这让我非常不喜欢Crystal Reports。我使用databaseexpert创建了一个到数据库的新连接,并用我想要使用的SQL创建了一个新命令。这定义了Crystal Reports可以使用的列,并允许您创建报告。然后在显示报告时,我们执行以下操作:

    ReportDocument rd = new ReportDocument();
    rd.Load(MapPathSecure("NameOfMyReport.rpt"));
    rd.SetDataSource(dataSet.Tables[0]);
    

    我只使用了一个表,所以我不知道数据集中有多个表会如何影响它。基本上,您可以使用数据库专家和命令设置报表的结构。然后在运行时覆盖实际数据。我真的希望Crystal Reports有一个更强大的方法来做这件事,或者如果它存在的话,我能理解它。