Microsoft Reporting Services 2005 的新报告前景






4.65/5 (50投票s)
2006年5月18日
5分钟阅读

180486

922
如何使用 WebService 作为数据源来构建 Microsoft Reporting Services 2005 报表。
引言
几个月前,我参与了对 Microsoft Reporting Services 2005 为开发人员提供的新选项的测试和评估,以创建更好的报表。其中一个选项是能够使用一个或多个 WebService 作为数据源的强大功能。不幸的是,MSDN 附带的帮助文档和 MS SQL Server 2005 书籍不够清晰,并且帮助文档中存在一些印刷错误。这些错误给开发人员带来了困难,开发人员可能会花费大量时间来解决问题。因此,本文旨在分享我对 Microsoft Reporting Services 2005 提供的这一绝佳机会的知识,以节省您的时间。
创建 WebService
我的第一步是创建一个测试 WebService,它将在稍后用作我的测试/演示报表的数据源。这是非常重要的一步,因为在将 DataSet
作为数据源提供之前,我们必须将其转换为 XmlDataDocument
。没有这个转换,当我们尝试使用 Webservice 的 web 方法从 AdventureWorks 示例数据库检索数据时,将无法在下一步获得任何结果。此转换在 C# 代码中表示如下:
[WebMethod]
public XmlDataDocument GetPersonAddress(string cityNameID)
{
//
// Define the local variables
//
StringBuilder myQuery = new StringBuilder();
XmlDataDocument resultXMLDocument = new XmlDataDocument();
SqlConnection myConnection = new SqlConnection();
SqlCommand myCommand = new SqlCommand();
SqlDataAdapter myDA = new SqlDataAdapter();
DataSet myDS = new DataSet();
//
// Prepare different query depend from precondition
//
if ((cityNameID != null) && (cityNameID.Trim() != ""))
{
myQuery.Append("Select City as City, " +
"AddressLine1 as Address, " +
"PostalCode From Address ");
myQuery.Append("Where City Like '" +
cityNameID.Trim().Replace("%", "") +
"%' Order By City");
}
else
{
myQuery.Append("Select City as City, AddressLine1" +
" as Address, PostalCode From Address" +
" Order By City");
}
//
// Get connection string and establish connection with server
//
myConnection.ConnectionString = ReadSetting("ConnectionString", "");
myCommand.Connection = myConnection;
myCommand.CommandText = myQuery.ToString();
myCommand.CommandType = CommandType.Text;
myDA.SelectCommand = myCommand;
//
// Return an DataSet with data from our query
//
try
{
myDA.Fill(myDS, "Address");
//
// Here we have to tansform our DataSet
// into XmlDataDocument before to return it
//
XmlDataDocument temporaryXMLDoc =
new XmlDataDocument(myDS);
resultXMLDocument = temporaryXMLDoc;
temporaryXMLDoc = null;
}
catch
{
resultXMLDocument = null;
}
finally
{
myDS.Dispose();
myDA.Dispose();
myCommand.Dispose();
myConnection.Dispose();
myQuery = null;
}
return resultXMLDocument;
}
最后,我们必须构建我们的 Webservice 并将其发布到我们的 IIS 5.0 服务器。因为我们使用的是 VS2005,并且如果您的计算机上安装了 VS2003,请在发布 Webservice 时,检查发布和关联服务的虚拟应用程序/目录是否具有默认设置 Microsoft ASP.2.0。
创建和部署使用 WebService 作为数据源的报表
下一步是使用 Microsoft Reporting Services 2005 创建一个报表,该报表将使用我们在第一步中构建和发布的 webservice 作为数据源。要完成此任务,您需要从 Microsoft SQL Server 2005 的安装 CD 中安装 Microsoft Reporting Services。我们将创建一个名为“TestReport”的新空 Reporting Services 项目。之后,我们将添加一个单独的共享数据源。这里,重要的是当您选择 XML 作为数据源类型时,在“常规”选项卡中写入的连接字符串。连接字符串如下所示。另外,您还可以看到我们用来从 Webservice 获取数据的查询。这里“http://madjarov_d_n_demo.org”是我们的服务命名空间。此外,在这里命名您想在 Webservice 中调用的方法也非常重要。在这种情况下,它是“GetPersonAddress
”。
图 1 连接字符串
图 2 查询字符串
最后,您可以选择“下一步”并构建报表。MS SQL Server 2005 和 VS2005 Studio 设计器中的最终报表外观如下所示:
图 3
现在,我们的 Webservice 方法 GetPersonAddress(string cityNameID)
中的查询 参数 会怎样?我们当然必须在某处定义并使用它。为了方便起见,Microsoft 提供了一个完美且对开发人员友好的报表引擎。在 Microsoft Reporting Services 2005 的报表中实现参数非常容易。首先,我们必须在设计模式下选择“报表参数”,并添加一个名为“cityNameID
”且数据类型为“string
”的参数。下图显示了这一点:
图 4
现在,最后一步是将此报表参数与 DataSet
连接起来。为此,我们必须在报表的设计模式下编辑数据源,并创建一个新的 DataSet
参数“cityNameID
”,然后将其与“Parameters!cityNameID.Value
”(这是我们之前定义的报表参数)逻辑连接。您可以在下图看到此连接:
图 5
现在,我们必须将此报表部署到报表服务器。在此操作之前,您必须确保您的设置“TargetReport Folder”和“TargetReport Server”具有正确的值。您可以在下图看到这些报表项目属性:
图 6
请注意,上图所示的设置是我当前的设置,在您的计算机上,您可能会有不同的设置。现在,我们的测试/演示报表已准备就绪,可以将其部署到合适的报表服务器上。
创建用于我们报表的简单 Web 查看器
我们的最后一个任务是创建一个基于 Web 的查看器应用程序,该应用程序将负责获取报表结果并将其可视化给我们。此外,更重要的是向您展示如何将参数从代码发送到报表。为此,我们必须使用 VS 2005(C#)环境创建一个名为“TestReportWebViewer”的新 Web 项目。只需将“Default.aspx”页面设置为我们新项目的默认页面,然后从“ToolBox”将“Report Viewer”控件添加到我们的页面。设置此控件以获得适当的大小,并按以下方式设置查看器设置:
图 7
请注意,“Reportingpath
”和“ReportServerUrl
”的设置与我们在上一步中部署的报表的值相同。这一点非常重要,否则我们的报表查看器将无法显示我们的报表。下面是我们的报表查看器组件 Init
事件的源代码:
protected void rptViewer_Init(object sender, EventArgs e)
{
//
// Create a new report's parameter and set it with inital value "Al"
//
ReportParameter cityID = new ReportParameter();
cityID.Name = "cityNameID";
cityID.Values.Add("Al");
//
// Setting-up the reportviewer control to use remote mode for processing
//
rptViewer.ProcessingMode = ProcessingMode.Remote;
//
// Send parameter and initialize the viewer control with correct report.
//
rptViewer.ServerReport.SetParameters(new ReportParameter[] { cityID });
}
最后,我想感谢您的耐心,我希望本文对您真正有用,并在您尝试在 Microsoft Reporting Services 2005 项目中实现 Webservices 作为数据源时为您提供正确的方向。请下载本文的源代码,并仔细查看。
注意:我想特别感谢我最好的同事 Svilen Donev 先生,感谢他宝贵的支持。