SQL Server Reporting Services(簡稱SSRS)

主要說說關於SSRS的安裝、部署和配置問題。

SSRS的安裝

Reporting Services作爲SQL Server的一個組件,自然是要伴隨SQL Server一起安裝了。目前SQL Server 的諸多版本,只有Enterprise和Development版本有着對SSRS的完全支持,Standard版本提供了大部分支持,具有高級功能的Express版只支持一些最基本的功能(不含設計器)。因此,在企業部署的時候應該選用Enterprise版,作爲開發者應選擇Development版。

在安裝SQL Server的過程中選中Reporting Services的相關組件,或者更改一個SQL Server的安裝以添加SSRS都是可行的。

注意上面說的是服務器端的安裝。SQL Server 2005 Development Edition的組件分爲服務器和工作站兩個部分。在安裝完服務器端的相關組件後,還需要在進行開發的機器(可以就在服務器上,也可以是另外的工作站)安裝工作站組件。其中的Business Intelligence Development Studio必須安裝,這是一個Visual Studio 2005的擴展,如果機器已經安裝過VS2005,那它就會直接將BI的開發模板集成進 VS中,如果沒有裝過,那它則會自動替你安裝一個VS2005外殼(沒有C#、VWD等組件)。

SSRS在服務器端的配置

服務器端配置SSRS有兩種方法,一是通過SQL Server Management Studio,登錄到Server進行操作;二是通過web訪問服務器的Report Manage頁面,比如http://IP/Reports。兩種方法在功能上略有差別,具體操作過程可以查看相關文檔。

這一部分來討論一下SSRS的一些基本功能,即報表的建立、發佈和引用。

創建報表

設計環境

報表設計環境就是那個Business Intelligence Development Studio,以下簡稱BI。如果項目是在VS2005下進行的,那麼就非常方便了,因爲可以在一個Solution裏像添加普通Project一樣來添加BI的工程。事實上我們也是這麼做的。

報表創建的基本步驟

在正式開始利用BI開發SSRS之前,強烈建議大家把隨機附帶的Book Online裏的相關教程全部手動完成一遍。

總的來說,一個報表的設計可以歸納爲下面的步驟:
創建報表工程
建立數據源(Data Source,rds文件),這是報表與數據庫進行通信的橋樑;
創建數據集,也就是報表的數據來源,報表從數據集獲取數據,並不直接訪問數據庫;
進行頁面佈局(layout)
預覽結果(preview),並根據結果進行進一步修改,直到完全滿足要求

報表的發佈

設計完報表之後,就要將其發佈到Reporting Services服務中,以供調用。我們可以把這個發佈稱作deploy。

經過實際應用,發現可以有下面三種方法來進行報表的發佈

在BI中編譯發佈

我們設計報表是在BI中進行的,可以利用它來一次性將整個報表工程deploy到服務器上。大致步驟如下:
菜單執行Project->Properties,將Configuration改爲Production,即編輯Production模式的參數;
在右邊分別填入相應的屬性值,一般來說TargetDataSourceFolder的內容Data Sources不變,如果數據源有更新,那麼就必須將上面的OverwriteDataSources設爲True;
設置TargetReportFolder。這個值是在Report Server中的一個虛擬目錄,該工程的所有rdl文件都將存放在這個目錄下;
設置TargetServerUrl。這裏就是Reporting Services所在的URL地址,比如本地部署可以用http://localhost/ReportServer。注意後面的那個路徑是默認的安裝路徑,在IIS中打開默認站點後可以看到它,是一個虛擬目錄;
都填寫完畢之後,在編譯環境中切換編譯模式爲Deploy,再Start Debugging,這時BI就會自動向Report Server部署這一系列的報表。

完了之後會顯示http://localhost/ReportServer這個頁面,在這個頁面中顯示的就是該報表服務器上所有的ReportFolder,而報表則會按照deploy時的設置,分別保存在這些folder內。進入Folder之後,點擊報表即可查看,系統已經爲我們生成了一個帶有ReportViewer的aspx頁面。

通過Web下的Report Manager

下面這兩種方法均是用來管理報表服務器,發佈報表只是它們的一部分功能。

使用Report Manager的大致步驟如下:
打開Report Manager的頁面,一般爲http://ServerUrl/Reports
進入Data Sources文件夾,上傳數據源的rds文件;
回到根文件夾,建立一個ReportFolder,名稱即TargetReportFolder中的值;
進入該文件夾,把rdl文件逐一上傳,它會自動給報表起名,一般接受默認值。

這樣就OK了,之後也可以在ReportServer頁面下查看內容。

通過SQL Server Management Studio

在SQL Server的配置中,這個工具無疑是最強大的。在登錄SSMS的時候,選擇Server Type爲Reporting Services,然後指定Server的名稱,以及登錄方式。登錄成功後,在Home目錄下就是我們在Report Manager中看到的內容,後面的操作大同小異,就不浪費文字了。

利用ReportViewer控件引用報表

建立、發佈報表的最終目的還是爲了在程序中引用它們,在此我們選擇的是最簡單的方法——使用ReportViewer控件。

WinForm環境下的ReportViewer

WinForm下的ReportViewer控件,位於Microsoft.Reporting.WinForms命名空間下,在VS2005中默認會出現在ToolBar中,直接將其拖放進窗體即可對其操作。

一般來說,所有報表都必須設置的參數有以下幾個:
ProcessingMode:這個屬性用來設置ReportViewer的數據來源是本地還是遠程,在這裏我們設爲Remote;
ServerReport.ReportServerUrl:就是我們前面看到的TargetServerUrl,即報表服務器的URL地址。注意這個地址包含了“ReportServer”,比如http://ServerUrl/ReportServer這樣;
ServerReport.ReportPath:是ReportFolder和ReportName的組合,比如“/Test/Report1.rdl”,注意注意千萬注意,最開始的那個“/”一定不能省略!

對於實際應用,採用代碼來控制ReportViewer要比設計時設置屬性更加常用,下面就是一個簡短的例子,概括了這樣一個過程:

this.reportViewer1.ServerReport.ReportPath = "/Test/Report1"; List<ReportParameter> parameters = new List<ReportParameter>(); parameters.Add(new ReportParameter("params",textQueryString.Text)); this.reportViewer1.ServerReport.SetParameters(parameters); this.reportViewer1.ShowParameterPrompts = false; this.reportViewer1.RefreshReport();

在上面的過程中,先是設置ReportPath(ReportServerUrl在本示例中已經指定,實際上應該通過App.config的設置字符串來設置)。然後創建報表參數列表(這個params的名稱是在設計報表的時候設置的報表參數,在SQL語句中通過@params進行引用),進而調用ServerReport的SetParameters方法,將參數傳遞給報表。緊接着,將報表的ShowParameterPrompts屬性設爲false,即不在ReportViewer的頭部顯示參數輸入提示。最後執行RefreshReport()方法,刷新報表頁面。

ASP.NET環境下的ReportViewer

微軟的統一性工作無疑是相當出色的,Web下的ReportViewer在使用起來與WinForm下完全相同,唯一不同的就是控件位於Microsoft.Reporting.WebForms下,而諸如ReportParameter等類也改爲此命名空間之下。在代碼控制報表方面,不需要進行改動即可移植。

Visual WebGUI下的ReportViewer

在項目中,我們是採用VWG來作爲程序的框架的。Gizmox開發團隊也爲ReportViewer設計了相應版本,控件位於Gizmox.WebGUI.Reporting命名空間下,但要注意,它的屬性諸如ReportParameter、ProcessingMode等仍然是位於Microsoft.Reporting.WebForms下的,這一點不要搞錯。

直接通過ReportServer訪問報表

還記得前面提到過的http://ServerUrl/ReportServer嗎?SSRS已經爲我們準備了一個用來查看報表的方法,即通過URL訪問,比如要查看在localhost/ReportServer服務器中,位於Test下的Report1報表,可以直接在瀏覽器中輸入 http://localhost/ReportServer?Test/Report1,SSRS會自動調用一個系統內置的頁面來顯示它。在這個帶參數的URL後面,我們可以通過附加URL參數的方法來對報表進行控制。比如上面的那個例子,在ASP.NET中可以使用Response.Write()向頁面寫入下面的代碼來彈出窗口顯示報表:

"<script language=/"JavaScript/"> window.open('http://localhost/ReportServer?Test/Report1&params=" + textQueryString.Text + "&rc:Parameters=false&rs:Command=Render'; </script>"

其中URL參數的構造方法請參閱MSDN相關文檔。

上面說的都是常規應用,但實際上一個報表從提出需求到最後部署,絕大部分都不是會了那個示例就能做的,中間會遇到各種各樣的問題。在這一部分中,我以問答的形式,將開發過程中遇到的問題以及解決方法分門類地列舉出來,並且不斷更新。

部署與調試
Q:我在ASP.NET下使用ReportViewer載入報表,爲什麼會出現{用戶“NT AUTHORITY/NETWORK SERVICE”授予的權限不足,無法執行此操作。 (rsAccessDenied)}的錯誤?
A:這是由於IIS下ReportServer虛擬目錄的訪問權限沒有設置正確。解決問題的方法有三種:
在服務器端訪問http://localhost/Reports,進入Report Manager,然後點擊“屬性”標籤頁下的“新建角色分配”,在“組或用戶名”中填入“NT AUTHORITY/NETWORK SERVICE”(沒有兩邊的引號),在下面勾選Browser,確定。這是給該賬戶賦以瀏覽報表的權限,我強烈推薦這種方法;
在IIS中,修改默認站點下ReportServer虛擬目錄的屬性,在Directory Security選項卡中,點擊Authentication and access control中的Edit,開啓匿名訪問,將匿名訪問帳戶設爲管理員賬號,本地登錄的就設爲Administrator,域賬號登錄的就設爲具有管理員權限的域賬號。這樣可以使訪問ReportServer的連接以管理員權限瀏覽報表。這也是網上流傳最廣的方法,但存在嚴重安全隱患,開發調試的時候沒問題,真正部署的時候不建議使用;
專門爲Reporting Services建立一個匿名帳戶,比如IUSR_ReportView,然後在Report Manager裏分配Browser角色,還有等等後續步驟。這是最麻煩的,步驟之多我都懶得在這裏寫全,同樣在網上流傳很廣,但我覺得只有實在閒着沒事幹的人才會用。。。

Q:我在Visual Studio裏開發VWG,以debug方式運行,然後在ReportViewer導出PDF時就報Session Expired錯誤,這是怎麼回事?
A:其實我也不知道爲什麼。。。解決的方法是不用debug方式,直接在瀏覽器訪問站點,就OK了。至於其原因,呼喚高人來解釋~~~


報表數據相關
Q:我現在不僅僅想向報表傳遞傳統的SQL參數,比如@ID、@Count,而是想整條WHERE子句以至整個SQL語句的任何地方都可以用參數的形式來控制,可以嗎?
A:當然可以,這都不行那SSRS也太[]

/r/n/n本文來自CSDN博客,轉載請標明出處:http://www.flatws.cn/article/program/sql-server/2010-08-25/9965.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章