4

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

在 VB6 中,原始作者对每个报告都简单地做了这样的事情:

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

GetAllUsers()返回一个选择一堆字段的 SQL 字符串;然后在报告中使用这些字段。

现在:
我如何在 .Net 中做类似的事情(使用内置的 Crystal Reports 或内置的“Microsoft Reporting Technology”)?

我无法让“数据库专家”识别globalConnectionObject(ADODB.Connection 对象);如果我填写数据集并执行

report.SetDataSource(dataSet)

它告诉我“报告没有表格”。

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

4

2 回答 2

2

创建连接:

/// <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,它将通过自动生成查询和数据表来帮助您从数据库中提取数据。在做了所有这些事情之后。在项目的某处创建一个方法,

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 中,根据您的要求在报表上添加表的字段。

另一种实现方式

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

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 中创建的数据表。

public void PopulateDataTable()
{
      DataTable dt = GetEmployee();
      Employee dsEmployee = New DataSet();
      dsEmployee.EmployeeDataTable dtEmp = new dsEmployee.EmployeeDataTable();
      dtEmp = dt;
}
于 2010-08-06T09:58:51.643 回答
0

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

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

我只用一张表完成了,所以我不知道 DataSet 中有多个表会如何影响它。基本上,您可以使用 Database Expert 和命令设置报告的结构。然后在运行时覆盖实际数据。我真的希望 Crystal Reports 有一种更强大的方式来执行此操作,或者如果它存在的话我能理解它。

于 2010-06-30T19:47:01.433 回答