C# 如何使用SQL填充Crystal报表

C# 如何使用SQL填充Crystal报表,c#,vb.net,vb6,crystal-reports,microsoft-reporting,C#,Vb.net,Vb6,Crystal Reports,Microsoft Reporting,因为在.Net中似乎没有任何方法加载旧的VB6(ActiveReports)报告,所以我需要在.Net中重新创建几十个报告。我想以最不痛苦的方式来做这件事 在VB6中,原始作者对每个报告都做了类似的操作: adoConn.ConnectionString = globalConnectionObject.ConnectionString adoConn.Source = ReportFunctions.GetAllUsers() GetAllUsers()返回选择一组字段的SQL字符串;然后在

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

在VB6中,原始作者对每个报告都做了类似的操作:

adoConn.ConnectionString = globalConnectionObject.ConnectionString
adoConn.Source = ReportFunctions.GetAllUsers()
GetAllUsers()
返回选择一组字段的SQL字符串;然后在报告中使用这些字段

For example , if you have columns
ID - integer
EmpName - string
Salary - double
Department - string
现在:
如何在.Net中执行类似操作(使用内置的Crystal Reports或内置的“Microsoft Reporting技术”)

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

report.SetDataSource(dataSet)
它告诉我“报告没有表格。”


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

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

ReportDocument rd = new ReportDocument();
rd.Load(MapPathSecure("NameOfMyReport.rpt"));
rd.SetDataSource(dataSet.Tables[0]);
我只使用了一个表,所以我不知道数据集中有多个表会如何影响它。基本上,您可以使用数据库专家和命令设置报告的结构。然后在运行时覆盖实际数据。我真的希望Crystal Reports有一个更强大的方法来实现这一点,或者如果它存在的话,我能理解它。

创建连接:

/// <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();
    }
}
现在在表单上添加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可用于各种对象。若您有动态绑定它的场景,请参阅下面我的答案,然后您可以做一件事,即向解决方案添加一个新的数据集。创建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;
  }
}

但是呢。。如果我在编译时不知道连接字符串,如何创建连接?您可以用通常的方法创建连接。我的方法要求你欺骗Crystal Reports。在生成报表时,您需要硬编码连接字符串(在Crystal Reports中创建到数据库和命令的连接),但在运行时使用SetDataSource使用真实数据覆盖它。您的意思是在编译时连接字符串/数据位置未知吗?有一件事我忘了,选择ADO.Net数据集作为SQL和Crystal报表之间的桥梁
public void PopulateDataTable()
{
      DataTable dt = GetEmployee();
      Employee dsEmployee = New DataSet();
      dsEmployee.EmployeeDataTable dtEmp = new dsEmployee.EmployeeDataTable();
      dtEmp = dt;
}