本文转自:http://technet.microsoft.com/zh-cn/library/aa337091
若要查看部署到报表服务器的报表或在本地文件系统上存在的报表,您可以在 Web 应用程序中使用 WebForms ReportViewer 控件来呈现它们。
将 ReportViewer 控件添加到 Web 应用程序
-
使用 Microsoft Visual C# 或 Microsoft Visual Basic 创建一个新的 Microsoft ASP.NET 网站。
- 或 -
打开一个现有的 ASP.NET 网站并添加一个新的 Web 窗体。
-
在“工具箱”中找到 ReportViewer 控件。 如果“工具箱”不可见,则可以通过从“视图”菜单中选择“工具箱”来进行访问。
-
将 ReportViewer 控件拖到 Web 窗体的设计图面上。
名为 reportViewer1 的 ReportViewer 控件便添加到该窗体中。
将控件添加到该窗体之后,“ReportViewer 任务”智能标记将出现,提示您选择某一报表。 如果您要查看的报表已部署到报表服务器上,则从“选择报表”下拉列表中选择<服务器报表>选项。 选择<服务器报表>选项后,将出现两个附加的属性:“报表服务器 URL”和“报表路径”。 “报表服务器 URL”是指向相应报表服务器的地址,“报表路径”是指向要呈现的报表的完整路径。 如果您想要以本地模式查看报表,则选择“设计新报表”选项以启动报表设计器或选择已是现有项目的一部分的报表。
下面的示例演示如何呈现已部署到某一报表服务器的报表。 此示例使用 AdventureWorks2012 示例报表项目随附的 Sales Order Detail 报表。
该示例使用集成的 Windows 身份验证,因此您首先必须启用模拟。 为此,将以下行插入 web.config 文件:
<!-- Web.config file. --> <identity impersonate="true"/>
注意 |
---|
默认情况下,模拟处于禁用状态。 |
protected void Page_Init(object sender, EventArgs e) { if (!Page.IsPostBack) { // Set the processing mode for the ReportViewer to Remote reportViewer.ProcessingMode = ProcessingMode.Remote; ServerReport serverReport = reportViewer.ServerReport; // Set the report server URL and report path serverReport.ReportServerUrl = new Uri("http://<Server Name>/reportserver"); serverReport.ReportPath = "/AdventureWorks Sample Reports/Sales Order Detail"; // Create the sales order number report parameter ReportParameter salesOrderNumber = new ReportParameter(); salesOrderNumber.Name = "SalesOrderNumber"; salesOrderNumber.Values.Add("SO43661"); // Set the report parameters for the report reportViewer.ServerReport.SetParameters( new ReportParameter[] { salesOrderNumber }); } }
下面的示例演示如何呈现作为 Windows 应用程序的一部分并且尚未部署到报表服务器的报表。
将 Sales Order Detail 报表添加到网站
-
打开该报表将添加到的网站。
-
在“网站”菜单中,选择“添加现有项”。
-
浏览到安装了 AdventureWorks 报表示例项目的位置。
默认位置是 C:\Program Files\Microsoft SQL Server\100\Samples\Reporting Services\Report Samples\AdventureWorks Sample Reports。
-
选择 Sales Order Detail.rdl 文件并单击“添加”按钮。
Sales Order Detail.rdl 文件现在应是该项目的一部分。
-
在解决方案资源管理器中右键单击 Sales Order Detail.rdl 文件,然后选择“重命名”。 将该报表重命名为 Sales Order Detail.rdlc,然后按 Enter。
如果解决方案资源管理器不可见,则可以通过从“视图”菜单中选择“解决方案资源管理器”来将其打开。
以下代码示例将为销售订单数据创建一个数据集,然后以本地模式呈现 Sales Order Detail 报表。
protected void Page_Init(object sender, EventArgs e) { if (!Page.IsPostBack) { // Set the processing mode for the ReportViewer to Local reportViewer.ProcessingMode = ProcessingMode.Local; LocalReport localReport = reportViewer.LocalReport; localReport.ReportPath = "Sales Order Detail.rdlc"; DataSet dataset = new DataSet("Sales Order Detail"); string salesOrderNumber = "SO43661"; GetSalesOrderData(salesOrderNumber, ref dataset); ReportDataSource dsSalesOrder = new ReportDataSource(); dsSalesOrder.Name = "SalesOrder"; dsSalesOrder.Value = dataset.Tables["SalesOrder"]; localReport.DataSources.Add(dsSalesOrder); GetSalesOrderDetailData(salesOrderNumber, ref dataset); ReportDataSource dsSalesOrderDetail = new ReportDataSource(); dsSalesOrderDetail.Name = "SalesOrderDetail"; dsSalesOrderDetail.Value = dataset.Tables["SalesOrderDetail"]; localReport.DataSources.Add(dsSalesOrderDetail); // Create the sales order number report parameter ReportParameter rpSalesOrderNumber = new ReportParameter(); rpSalesOrderNumber.Name = "SalesOrderNumber"; rpSalesOrderNumber.Values.Add("SO43661"); // Set the report parameters for the report localReport.SetParameters( new ReportParameter[] { rpSalesOrderNumber }); } } private void GetSalesOrderData(string salesOrderNumber, ref DataSet dsSalesOrder) { string sqlSalesOrder = "SELECT SOH.SalesOrderNumber, S.Name AS Store, " + " SOH.OrderDate, C.FirstName AS SalesFirstName, " + " C.LastName AS SalesLastName, E.Title AS " + " SalesTitle, SOH.PurchaseOrderNumber, " + " SM.Name AS ShipMethod, BA.AddressLine1 " + " AS BillAddress1, BA.AddressLine2 AS " + " BillAddress2, BA.City AS BillCity, " + " BA.PostalCode AS BillPostalCode, BSP.Name " + " AS BillStateProvince, BCR.Name AS " + " BillCountryRegion, SA.AddressLine1 AS " + " ShipAddress1, SA.AddressLine2 AS " + " ShipAddress2, SA.City AS ShipCity, " + " SA.PostalCode AS ShipPostalCode, SSP.Name " + " AS ShipStateProvince, SCR.Name AS " + " ShipCountryRegion, CC.Phone AS CustPhone, " + " CC.FirstName AS CustFirstName, CC.LastName " + " AS CustLastName " + "FROM Person.Address SA INNER JOIN " + " Person.StateProvince SSP ON " + " SA.StateProvinceID = SSP.StateProvinceID " + " INNER JOIN Person.CountryRegion SCR ON " + " SSP.CountryRegionCode = SCR.CountryRegionCode " + " RIGHT OUTER JOIN Sales.SalesOrderHeader SOH " + " LEFT OUTER JOIN Person.Contact CC ON " + " SOH.ContactID = CC.ContactID LEFT OUTER JOIN" + " Person.Address BA INNER JOIN " + " Person.StateProvince BSP ON " + " BA.StateProvinceID = BSP.StateProvinceID " + " INNER JOIN Person.CountryRegion BCR ON " + " BSP.CountryRegionCode = " + " BCR.CountryRegionCode ON SOH.BillToAddressID " + " = BA.AddressID ON SA.AddressID = " + " SOH.ShipToAddressID LEFT OUTER JOIN " + " Person.Contact C RIGHT OUTER JOIN " + " HumanResources.Employee E ON C.ContactID = " + " E.ContactID ON SOH.SalesPersonID = " + " E.EmployeeID LEFT OUTER JOIN " + " Purchasing.ShipMethod SM ON SOH.ShipMethodID " + " = SM.ShipMethodID LEFT OUTER JOIN Sales.Store" + " S ON SOH.CustomerID = S.CustomerID " + "WHERE (SOH.SalesOrderNumber = @SalesOrderNumber)"; SqlConnection connection = new SqlConnection("Data Source=(local); " + "Initial Catalog=AdventureWorks; " + "Integrated Security=SSPI"); SqlCommand command = new SqlCommand(sqlSalesOrder, connection); command.Parameters.Add( new SqlParameter("SalesOrderNumber", salesOrderNumber)); SqlDataAdapter salesOrderAdapter = new SqlDataAdapter(command); salesOrderAdapter.Fill(dsSalesOrder, "SalesOrder"); } private void GetSalesOrderDetailData(string salesOrderNumber, ref DataSet dsSalesOrder) { string sqlSalesOrderDetail = "SELECT SOD.SalesOrderDetailID, SOD.OrderQty, " + " SOD.UnitPrice, CASE WHEN " + " SOD.UnitPriceDiscount IS NULL THEN 0 " + " ELSE SOD.UnitPriceDiscount END AS " + " UnitPriceDiscount, SOD.LineTotal, " + " SOD.CarrierTrackingNumber, " + " SOD.SalesOrderID, P.Name, P.ProductNumber " + "FROM Sales.SalesOrderDetail SOD INNER JOIN " + " Production.Product P ON SOD.ProductID = " + " P.ProductID INNER JOIN " + " Sales.SalesOrderHeader SOH ON " + " SOD.SalesOrderID = SOH.SalesOrderID " + "WHERE (SOH.SalesOrderNumber = @SalesOrderNumber) " + "ORDER BY SOD.SalesOrderDetailID"; using (SqlConnection connection = new SqlConnection("Data Source=(local); " + "Initial Catalog=AdventureWorks; " + "Integrated Security=SSPI")) { SqlCommand command = new SqlCommand(sqlSalesOrderDetail, connection); command.Parameters.Add( new SqlParameter("SalesOrderNumber", salesOrderNumber)); SqlDataAdapter salesOrderDetailAdapter = new SqlDataAdapter(command); salesOrderDetailAdapter.Fill(dsSalesOrder, "SalesOrderDetail"); } }