2012年5月11日 星期五

ASP.NET 顯示 Report Service 的報表(二) - rdl, asp.net

上一章節,接下來就是利用到 VS 2010 來撰寫程式碼鏈結 Reporting Server 上的報表了。
也就是利用網站的網頁來直接鏈結呈現報表結果。
因為報表有些屬於隱私資料,所以在開發上要注意一些敏感性報表資料呈現是否合宜,例如機密資料就需先進行網站 Membership 的認證再進行網頁資料的呈現等等。

注意事項:

  • .NET FRAMEWORK 3.0 以下版本,請注意有沒有按裝支援 AJAX 的元件。
  • Reporting Server 的驗證是 Windows 帳密驗證非 SQL SA 等資料庫帳密的驗證。
  • 這次範例程式碼語言為 C#



1.新建立一網站專案,並建立欲鏈結的網頁,此次是用 Default.aspx 作為範例頁面。
2.因為這次用的 Report Service 2008 。
所以切換至設計請先拖曳 AJAX擴充功能 >> ScriptManager 控制項至頁面最上方。
然後再拖曳 報告 >> ReportViewer 控制項至網頁適當位置。
因為這次鏈結有字串(String)參數 TitleName 要傳送,新增一 標準 >> TextBox 控制項以及 Button 控制項處理確認鏈結,如下圖。
3.雙擊點選 Default.aspx.cs 進入程式碼撰寫,因為這次需要實作 IReportServerCredentials 介面,先進行介面程式CustomReportCredentials類別的撰寫。

public class CustomReportCredentials : Microsoft.Reporting.WebForms.IReportServerCredentials
    {
        // local variable for network credential
        private string strUserName;
        private string strPassWord;
        private string strDomainName;
        public CustomReportCredentials(string UserName, string PassWord, string DomainName)
        {
            strUserName = UserName;
            strPassWord = PassWord;
            strDomainName = DomainName;
        }
        public System.Security.Principal.WindowsIdentity ImpersonationUser
        {
            // not use ImpersonationUser
            get { return null; }
        }
        public System.Net.ICredentials NetworkCredentials
        {
            // use NetworkCredentials
            get { return new System.Net.NetworkCredential(strUserName, strPassWord, strDomainName); }
        }
        public bool GetFormsCredentials(out System.Net.Cookie authCookie, out string userName, out string password, out string authority)
        {
            // not use FormsCredentials unless you have implements a custom autentication.
            authCookie = null;
            userName = null;
            password = null;
            authority = null;
            return false;
        }
    }


4.再撰寫一個呼叫的SetReportViewerAuth類別。請注意報表報表位置、帳號、密碼

public void SetReportViewerAuth(Microsoft.Reporting.WebForms.ReportViewer sender, string ReportName, Microsoft.Reporting.WebForms.ReportParameter[] _params)
    {
        string strReportsServer = "報表位置"; //報表位置IP
        string strUserName = "帳號"; //Windows驗證非SQL驗證
        string strPassword = "密碼";

        Microsoft.Reporting.WebForms.IReportServerCredentials mycred = new CustomReportCredentials(strUserName, strPassword, strReportsServer);
        sender.ProcessingMode = Microsoft.Reporting.WebForms.ProcessingMode.Remote;

        Uri reportUri = new Uri("http://" + strReportsServer + "/reportserver");
        var _with1 = sender.ServerReport;
        _with1.ReportServerUrl = reportUri;
        _with1.ReportPath = "/" + ReportName;
        _with1.ReportServerCredentials = mycred;
        _with1.SetParameters(_params);

        sender.ShowParameterPrompts = false;
        sender.Visible = true;
        sender.ZoomPercent = 75;
    }


5.切下來處理頁面上 Button 控制項點擊的事件。如有更多參數,請注意新增參數的陣列即可。

 protected void Button1_Click(object sender, EventArgs e)
    {
        Microsoft.Reporting.WebForms.ReportParameter[] _params = new Microsoft.Reporting.WebForms.ReportParameter[1];
        _params[0] = new Microsoft.Reporting.WebForms.ReportParameter("TitleName", this.TextBox1.Text); //參數名稱
        SetReportViewerAuth(ReportViewer1, "RPReport", _params); //報表名稱
    }


6.接下來就是測試看看了。
7.輸入參數後點選確定,會出現正在載入的畫面。
8.接下來便是成功載入報表的畫面呈現了。
只要注意參數的傳遞便可以把報表直接鑲嵌在網頁供使用者使用了。


SQL Server Reporting Services in ASP.NET

1 則留言:

  1. 我在網路上找到您這篇謝謝您幫了一個大忙
    在此感謝

    另外分享一下 您的內容
    Microsoft.Reporting.WebForms.IReportServerCredentials mycred = new CustomReportCredentials(strUserName, strPassword, strReportsServer);

    strReportsServer 應該改成 strDomain才對

    回覆刪除