SSRS的安装、部署和配置
http://www.cnblogs.com/millen/archive/2009/07/17/1525528.html
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里的相關教程全部手動完成一遍。
總的來說,一個報表的設計可以歸納為下面的步驟:
報表的發布
設計完報表之后,就要將其發布到Reporting Services服務中,以供調用。我們可以把這個發布稱作deploy。
經過實際應用,發現可以有下面三種方法來進行報表的發布
在BI中編譯發布
我們設計報表是在BI中進行的,可以利用它來一次性將整個報表工程deploy到服務器上。大致步驟如下:
完了之后會顯示http://localhost/ReportServer這個頁面,在這個頁面中顯示的就是該報表服務器上所有的ReportFolder,而報表則會按照deploy時的設置,分別保存在這些folder內。進入Folder之后,點擊報表即可查看,系統已經為我們生成了一個帶有ReportViewer的aspx頁面。
通過Web下的Report Manager
下面這兩種方法均是用來管理報表服務器,發布報表只是它們的一部分功能。
使用Report Manager的大致步驟如下:
這樣就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¶ms=" + 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也太圡了。。在這里需要用到報表語句。用過Excel吧,單元格的值如果用“=”開頭,那后面就可以跟表達式,報表語句也一樣。一個最簡單的例子,比如像我現在想用參數傳遞一整條WHERE子句,就這么做:
- 菜單中Report->Report Parameters,Add一個新參數,假定Name叫做WhereString,類型String,別的不動
- 在Data頁中修改需要接受參數的DataSet,假設原來SQL語句的內容為“select * from table1 where age between 10 and 15 and id>40”
- 修改為 ="select * from table1 where " + Parameters!WhereString.Value
- 好,切換到Preview中,看結果吧。
- Q:我在那個Parameters提示框中什么都沒填,直接點擊View Report,出錯了耶。。。
A:-_-|| 當然會出錯,SQL語句中的where后面沒有條件,語法不正確啊。。像這種情況,你得在表達式語句里做一個判斷,看是否傳入的參數為空。上面那個例子,就可以改為:
="select * from table1" + IIF(Parameters!WhereString.Value<>"", " where " + Parameters!WhereString.Value, "")
這里的IIF是報表語句的一種,屬于Program Flow語句。至于更博大精深的用法,參閱文檔~~
- Q:這太神奇了,那你能告訴我,如果我想在一個頁面里加入“第X頁/共Y頁”這種,又該怎么做呢?
A:這還是要用到報表語句。進入Layout視圖,在任意一個文本框右鍵點擊然后選Expression,就是前面有個“fx”圖標的那個,就能看到表達式編輯器。在左下的那個框 中列出的就是報表語句的類別,看到Globals了嗎?點擊一下,右邊就會有一些關于報表本身的常量,那個PageNumber和TotalPages就是這里要用的。前面用到的Parameters和 IIF在這里也都能找到。靈活應用這些元素可以極大豐富報表的表現力。
哦,忘了說一點,PageNumber和TotalPages這兩個量都只能在頁眉或者頁腳處才可使用,所以在用它們之前需要在Layout視圖中,菜單Report->Page Header(或Page Footer),開啟 頁眉或頁腳,然后在里面引用。
注意這里的where后面有個空格,尤其是在構造SQL語句的時候,一定要特別注意空格的使用。
報表Layout相關
- Q:為什么我的報表打印出來之后水平方向跨頁啦?我在設計頁面中明明沒有越界啊!
A:cft...你的眼睛欺騙了你。設計界面的那個頁面邊界其實跟你的紙張頁面完全沒有關系,SSRS也沒有提供整頁居中的功能,所以你必須一點點地微調你的頁面布局。
首先我建議在菜單Report->Report Properties->Layout選項卡中,將左右Margin都改為0。然后回到設計界面,通過手動指定控件的Locate屬性的方法,來確定左側邊界的大小。比如現在的紙張是A4大小(21cm*29.7cm),我的正文表格總寬度設置為17.75cm,剩下的3.25cm是左右頁邊距總和,按理說應該各分配1.625cm,但考慮到表格里的表格線也是有寬度的(我設的是1pt),因此將左頁邊距設為1.6cm,也就是把控件擺放在距離設計頁面左側1.6cm的位置,再說的明白點就是把靠左的各控件的Locate屬性中的Left元素的值設為1.6cm(好多定語啊。。我不是故意的。。)。
進行預覽的時候建議用ReportViewer的導出功能導出為pdf查看,也可以打印到pdf、xps,要是你再土豪一點,直接打印到紙上看是最好。這個微調是個痛苦的過程。
合
經過這一段時間的開發經歷,個人感覺SSRS還是非常好用的,與SQL Server的無縫集成,layout的靈活多變以及報表語言的強大功能,加上微軟產品的親和性,帶來的是清爽的使用體驗。不過SSRS的執行效率并不高,尤其是SQL 2005版的SSRS在建立DataSet的時候還只能用SQL語句來查詢,實現復雜的業務邏輯還不是很方便。并且在動態列顯示以及動態頁面設置還有待提高。
?
總結
以上是生活随笔為你收集整理的SSRS的安装、部署和配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 脚本示例 (Reporting Serv
- 下一篇: 图解:SQL Server SSIS包和