如何使用 SQL 填充 Crystal Reports
Posted
技术标签:
【中文标题】如何使用 SQL 填充 Crystal Reports【英文标题】:How to populate Crystal Reports with SQL 【发布时间】:2010-06-30 19:37:05 【问题描述】:由于似乎没有任何方法可以在 .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 报表!? (连接字符串/数据位置在编译时未知)
【问题讨论】:
你的意思是编译时不知道连接字符串/数据位置吗? 【参考方案1】:创建连接:
/// <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
现在在您的表单上添加一个报表查看器控件。
ReportViewer1 rpt = New ReportViewer();
ReportDocument rptDoc = new ReportDocument();
rptDoc.Load("path of rpt file");
rptDoc.SetDataSource(GetAllEmployees());
rpt.Document = rptDoc;
rpt.Refresh();
在此之前从水晶报表中,根据您的要求在报表上添加表格的字段。
另一种实现方式
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;
【讨论】:
我忘了一件事,选择 ADO.Net 数据集作为 SQL 和 Crystal 报表之间的桥梁【参考方案2】:我们使用 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 有一种更强大的方式来执行此操作,或者如果它存在的话我能理解它。
【讨论】:
但是,如果我在编译时不知道连接字符串,我该如何创建连接? 您可以按照通常的方式创建它。我的方法要求你欺骗水晶报表。构建报表时需要对连接字符串进行硬编码(在 Crystal Reports 中创建与数据库和命令的连接),然后在运行时使用 SetDataSource 用真实数据覆盖它。以上是关于如何使用 SQL 填充 Crystal Reports的主要内容,如果未能解决你的问题,请参考以下文章
错误20599无法使用VB6 / Crystal报表打开SQL Server
Crystal Reports中的“多部分标识符无法绑定”与SQL表达式/子查询
.Net Crystal Reports 13 可以使用应用程序池身份登录 SQL Server 吗?