将 Reporting Services 2005 集成到 Web 应用程序中






4.59/5 (22投票s)
2006 年 9 月 4 日
7分钟阅读

387266
本文提供了有关如何使用 ReportViewer 控件将 MS Reporting Services 报表集成到 ASP.NET Web 应用程序中的分步说明。它还包含一个可用于布局的 HTML 模板,并解决了 ReportViewer 控件的一些已知问题。
引言
随着 Visual Studio 2005 的发布,Microsoft 使将 SQL Reporting Services 集成到 ASP.NET Web 应用程序变得更加容易。Reporting Services 的大多数所需功能都可以通过其 ReportViewer 控件实现,而这正是本文的重点。对于那些需要对将 RS 报表嵌入应用程序进行非常精细和详细自定义的用户,我建议您查找讨论 RS 对象模型及其 SOAP 接口的文章。否则,本文应为您提供有关如何使用 Visual Studio 2005 将 Report Services 集成到 Web 应用程序中的一个好教程。
分步说明
启动 Visual Studio 2005。在文件菜单中,单击“新建”->“新建网站”。在对话框中,选择 ASP.NET 网站,选择您的语言首选项(本文档使用 C#),以及您希望构建网站的位置。单击“确定”。
在嵌入 ReportViewer 控件时,最困难的任务之一是确保它恰好填充您想要的区域,不多也不少。您还希望 ReportViewer 使用自己的滚动条,而不是浏览器的滚动条。
我编写的代码基本上是一个您可以使用的模板,它为页眉、自定义控件栏和报表本身设置了一个区域。
由于 ReportViewer 在表格中(可能不是 100% XHTML)占用 100% 空间存在困难,因此您需要删除任何 XHTML 设置。
在 ASP.NET 代码中,您需要删除(或更改)此行
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
您可能还需要将验证从非 XHTML 设置更改为类似 HTML 4.01 的设置。
如果您的目标受众只使用 IE 浏览器,请将 body 标签更改为如下形式
<body style="vertical-align: bottom; height: 100%; margin-right: 0px;
margin-top: 0px; margin-bottom: 0px; margin-left: 0px;
padding-bottom: 0px; padding-top: 0px">
如果任何用户还使用 Mozilla 浏览器,请将 body 标签的高度更改为 99.3%。这是为了避免出现双重垂直滚动条效果,即您可以看到 ReportViewer 的滚动条和浏览器的滚动条。Mozilla 浏览器底部将有一个几乎无法察觉的空间。请注意,ReportViewer 内的内容可能无法正确显示(在 Report Manager 中也无法正确显示)。因此,此时请自行承担使用 Mozilla 开发报表的风险。
<body style="vertical-align: bottom; height: 99.3%; margin-right: 0px;
margin-top: 0px; margin-bottom: 0px; margin-left: 0px;
padding-bottom: 0px; padding-top: 0px">
接下来,请将 `<form>` 标签之间的任何现有代码替换为以下代码
<table style="vertical-align: bottom; border-width: 0px; margin-top: 0px;
margin-bottom: 0px; width: 100%; height: 100%; padding: 0px,0px,0px,0px;"
cellspacing="0" cellpadding="0">
<tr>
<td>
HEADER
</td>
</tr>
<tr>
<td>
<div style="border-top: black 1px solid;
background-color: #ece9d8; border-bottom-width: 1px;
border-bottom-color: #d4d0c8; padding-bottom: 10px;">
Custom Controls
</div>
</td>
</tr>
<tr>
<td style="height: 100%;">
<%-- This is where the ReportViewer control will go. --%>
</td>
</tr>
</table>
现在,请切换到“设计”视图,是时候添加 ReportViewer 控件了。
在工具箱的“数据”部分,将 ReportViewer 控件拖到表格的最后一行,该行应占据大部分页面。接下来,您需要设置控件的属性,使其指向正确的服务器和正确的报表。在属性中,转到“服务器报表”部分。在此部分的正上方,您应该会看到一个名为“处理模式”的属性。在大多数情况下,您需要使用报表服务器实例。因此,在本教程中,请将此属性设置为“远程”,即使报表服务器实例与您的 Web 应用程序在同一台计算机上。接下来,您需要设置“ServerReport”设置。
首先,在“ReportSeverUrl”字段中输入报表服务器的地址。
语法如下
http:// NameOfServer / reportserver
例如:http://ServerOne/reportserver
接下来,在“ReportPath”字段中输入报表的位置。
例如:/MyReports/TheReport
报表管理器中的路径结构就是您看到的路径,因此很容易知道其位置。另外,请务必在实际路径前加上一个正斜杠。
除非您希望 ReportViewer 具有绝对大小,否则请在“布局”部分将高度和宽度设置设置为 100%。ReportViewer 默认会显示用于设置报表参数的控件。这些控件通常看起来有点丑陋,我建议大多数开发人员创建自己的参数控件。这可以在上面提供的模板的控件栏行中完成。要删除 ReportViewer 的参数控件,请将“外观”下的属性中的“ShowParameterPrompts”设置为 false。在下一节中,我将展示如何使用自己的代码设置报表参数。
这些就是 ReportViewer 正确显示所需的所有设置,除非您的 Visual Studio 版本具有其他默认设置。请仔细检查,确保 ASP.NET 代码与此代码相似
<rsweb:ReportViewer ID="ReportViewer1" runat="server" Height="100%"
ProcessingMode="Remote" ShowParameterPrompts="False" Width="100%">
<ServerReport ReportPath="/MyReports/TheReport" />
</rsweb:ReportViewer>
现在,报表已准备好进行处理。您可以预览您的网站,报表应该可以正常生成。
通过 C#/VB 代码显示报表
在许多情况下,您可能需要将参数传递给报表,或者您的代码(或最终用户)可能需要控制生成哪个报表。例如,您可能有一个下拉列表,允许用户选择他们希望查看的报表。然后,他们可以单击一个按钮来生成接受当前时间参数的报表。(按钮和下拉列表可以放在模板的自定义控件栏部分。)
因此,“Click-Button-Event-Handler”函数中的代码是我们放入自定义 ReportViewer 代码的地方。本文中的代码是 C#,但 VB 代码应该差别不大。
首先,如果您没有通过可视化设计器设置报表服务器 URL,您可以在此处进行设置。
this.ReportViewer1.ServerReport.ReportServerUrl =
new System.Uri("http://ServerOne/reportserver");
ReportViewer 控件中一个相当常见的错误/问题是,当您通过网站本身从钻取报表切换到另一个报表时,可能会发生 ASP.NET 错误。这是因为 ReportServer 认为新报表仍然是钻取报表,而实际上并非如此。为了解决这个问题,请使用以下代码
while (this.ReportViewer1.ServerReport.IsDrillthroughReport)
{
this.ReportViewer1.PerformBack();
}
此代码将设置您想显示的任何报表为父报表。
接下来,您需要设置新报表路径
// Could also be set to the selection of a ListBox.
string strReport = "/MyReports/TheReport";
this.ReportViewer1.ServerReport.ReportPath = strReport;
如果需要参数,您需要首先声明一个 ReportParameter 对象数组。
Microsoft.Reporting.WebForms.ReportParameter[] RptParameters = new Microsoft.Reporting.WebForms.ReportParameter[1];
在这种情况下,我们只需要一个参数。
接下来,将 `RptParameters` 数组的第一个索引 (0) 分配给一个新的 `ReportParameter` 对象,其构造函数采用以下语法
ReportParameter(ReportParameterName, Value);
即
string strTime = System.DateTime.Now.ToShortTimeString();
RptParameters[0] =
new Microsoft.Reporting.WebForms.ReportParameter("CurrentTime", strTime);
然后,您需要将 `RptParameters` 对象设置为 ReportViewer 控件。
this.ReportViewer1.ServerReport.SetParameters(RptParameters);
最后,要使这些更改生效,请调用 `Refresh()` 函数
this.ReportViewer1.ServerReport.Refresh();
因此,总而言之,按钮点击事件处理函数中的代码应如下所示
this.ReportViewer1.ServerReport.ReportServerUrl =
new System.Uri("http://serverone/reportserver");
while(this.ReportViewer1.ServerReport.IsDrillthroughReport)
{
this.ReportViewer1.PerformBack();
}
// Could also be set to the selection of a ListBox.
string strReport = "/MyReports/TheReport";
this.ReportViewer1.ServerReport.ReportPath = strReport;
Microsoft.Reporting.WebForms.ReportParameter[] RptParameters =
new Microsoft.Reporting.WebForms.ReportParameter[1];
string strTime = System.DateTime.Now.ToShortTimeString();
RptParameters[0] =
new Microsoft.Reporting.WebForms.ReportParameter("CurrentTime", strTime);
this.ReportViewer1.ServerReport.SetParameters(RptParameters);
this.ReportViewer1.ServerReport.Refresh();
如果您愿意,可以删除可视化设计器中的 `ReportPath` 属性。这将确保在您自己的代码加载报表之前,不会加载任何报表。但是,这也将删除 ReportViewer 控件栏,您可能希望保留它以便网站看起来更具结构性。我通常的做法是将默认的 `ReportPath` 设置为指向一个基本上是欢迎屏幕的报表。然后,最终用户可以从我的选择控件中选择参数,然后,当用户准备好时,他们可以单击一个按钮来生成所需的报表。
结论
我提供的 ASP.NET 代码是我自己在不同项目中使用的代码。虽然我个人更关注软件编程而不是网页设计,但我确实会尝试使我的网页 100% XHTML。不幸的是,由于 ReportViewer 自己的 HTML 代码,我无法完全遵守该标准。如果有人有一个 100% XHTML 解决方案,允许 DOCTYPE 标签至少设置为 XHTML transitional,能够在表格中以 100% 的大小显示 RS 报表,并允许 ReportViewer 控件使用自己的滚动条,我很乐意修改本文。否则,我提供的模板应该允许您将一个显示精美的 RS 报表嵌入到可由 IE 浏览器处理的网页中。
此外,这只是针对 IE 浏览器的解决方案。布局模板与 Mozilla 浏览器配合良好,但 ReportViewer 自己的 HTML 代码则不行。当然,这可能会随着 Mozilla 浏览器的新版本而改变。
如果您希望在显示 ReportViewer 参数提示等区域上稍微偏离本文,那么网站可能无法按预期显示。但是,您应该很容易地采用我的 HTML 代码并进行调整(例如,添加/删除边框线),使其符合您的需求。
至于 C# 代码,唯一可能令人困惑的是用于钻取回父报表的 while 循环。 `Refresh()` 函数似乎应该自动执行此操作,但它只会导致 ASP.NET 错误。希望这将在 ReportViewer 控件的后续版本中得到修复,但目前该循环是解决此问题的一个好方法。