将 RDL 文件、SQL 和连接字符串传递给 Winform C# 项目上的 ReportViewer 控件以在运行时显示报表的最优雅的方法是什么?
介绍:
- 我最近开始在 Windows 上创建报告。我发现
RDLC 文件充当静态文件,无需连接
字符串或SQL语句,所以我们需要将DataSource传递给它
命令在运行时用数据填充它。这不利于我们
目的。
- 然而,RDL 文件可以采用 SQL 语句和连接字符串,其中
它们保存在 XML 标签中并用于生成动态报告。
鉴于我有
- RDL报告模板
- SQL语句
- 到数据库的连接字符串
将此信息传递给 C# Winform 中的 ReportViewer 以生成报告的最佳方法是什么?
1) 对于用于图书馆管理系统的 RDL。 (我们无法控制这些文件,这些文件由我们应用程序的用户使用)。
<Query>
<DataSourceName>DS1</DataSourceName>
<CommandText>select bk_book_details.id, bk_book_details.book_id, bk_book_details.book_no, bk_book_details.book_name, bk_book_details.edition_id, bk_book_details.condition_id, bk_book_details.publication_year, bk_book_details.price, bk_book_details.purchase_price, bk_book_details.reference_no, bk_book_details.book_status, bk_book_details.purchase_id, bk_book_details.purchase_date from bk_book_details</CommandText>
</Query>
2)这是SQL语句
select bk_book_details.id, bk_book_details.book_id, bk_book_details.book_no, bk_book_details.book_name, bk_book_details.edition_id, bk_book_details.condition_id, bk_book_details.publication_year, bk_book_details.price, bk_book_details.purchase_price, bk_book_details.reference_no, bk_book_details.book_status, bk_book_details.purchase_id, bk_book_details.purchase_date from bk_book_details
3)这是连接字符串
server=localhost;User Id=root;password=root;Persist Security Info=True;database=lms
电流输出:如 RDLReader.exe 应用程序中所示
用于获取此输出的代码
private void btnReport_Click(object sender, EventArgs e) {
string sql = "select bk_book_details.id, bk_book_details.book_id, bk_book_details.book_no, bk_book_details.book_name, bk_book_details.edition_id, bk_book_details.condition_id, bk_book_details.publication_year, bk_book_details.price, bk_book_details.purchase_price, bk_book_details.reference_no, bk_book_details.book_status, bk_book_details.purchase_id, bk_book_details.purchase_date from bk_book_details";
string RDLReaderApplication = @"""""""" + Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @""\ReaderPath\RDLReader.exe"" + @"""""""";
string reportFile = @"""""""" + Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @""\Reports\ReportFile.RDL"" + @"""""""";
string connectionString = @"""""""" + "server=localhost;User Id=root;password=root;Persist Security Info=True;database=lms" + @"""""""";
Process.Start(RDLReaderApplication, reportFile + "" "" + @"""""""" + sql + @"""""""" + "" "" + connectionString);
}
预期输出:
到目前为止的工作:
表格ReportForm
包含ReportViewer
控件停靠在窗体上。
附加信息:
1)我想将3个数据发送到ReportViewer
控件,以不同的形式停靠并在 ReportViewer 上加载报表。
2) 我们的用户不与我们共享连接,因此我们无法将其硬编码到 RDL 文件中。 SQL 通常是一个常量,RDL 文件通常根据特定形式的需要设计一次。
3)我们目前使用MySQL数据库。但任何流行的 RDBMS 中的解决方案都会有很大帮助。我希望上面的查询能够很好地描述正在访问的表的架构(查询包含表中的所有列)。
注意:请在 RDL 文件中包含答案,而不是在 RDLC 文件中包含答案。
除了@Reza Aghaei 给出的答案之外,最终为我解决问题的是什么
报告文件具有数据源和数据集的标签,位于 RDL 文件的开头,如下所示
<DataSets>
<DataSet Name="Data">
<Query>
<DataSourceName>DS1</DataSourceName>
来自 @Reza Aghaei 的行,询问 DataSet (Data) 的名称,而不是 DataSourceName (DS1)。做出这种区分对于使报告文件发挥作用至关重要。
var rds = new Microsoft.Reporting.WinForms.ReportDataSource("DataSet1", this.ReportData);
将其更改为:
var rds = new Microsoft.Reporting.WinForms.ReportDataSource("Data", this.ReportData);