建立報表(Report Viewer) - 自訂資料來源

Designed by Freepik
上一篇發現只要很簡單的建立SqlDataSource就可以將資料丟給ReportViewer產生報表,
但如果是要做動態查詢怎麼辦? 也很簡單~來看看吧。
圖片來源Designed by Freepik

  1. 上次提到最後的步驟是我們需要三個物件。
    a. ScriptManager
    b. SqlDataSource
    b. ReportViewer

    在ReportViewer的右上角,點擊小三角形,並選擇剛剛產生的報表(RDLC檔),
    點擊「選擇報表來源」,並指定「資料來源執行個體」。









如果你要自訂查詢SQL語法,請不要指定「資料來源執行個體」,
也就是上圖中的5. 選擇(無)即可。
接著有兩種基本的方式可以將資料指定給報表
  1. 1. 指定DataTable給報表。
ReportViewer1.LocalReport.DataSources.Clear();
string strConn = WebConfigurationManager.ConnectionStrings["yourName"].ConnectionString;
string strSQL = @"SELECT * from preorder where active = @active";
DataTable dt = new DataTable();
using (SqlConnection conn = new SqlConnection(strConn))
{
  conn.Open();
  using (SqlCommand cmd = new SqlCommand(strSQL, conn))
  {
    cmd.CommandType = CommandType.Text;
    cmd.Parameters.AddWithValue("@active", '0');

    SqlDataReader dr = cmd.ExecuteReader();

    dt.Load(dr);
    dr.Close();
  }
}
ReportViewer1.LocalReport.DataSources.Clear();
ReportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource("dsPreOrder", dt));
ReportViewer1.LocalReport.Refresh();

  1. 2. 直接將SqlDataSource指定給報表。
string strSQL = @"SELECT * from preorder where active = @active";
dsRpt01.SelectParameters.Add("active", TypeCode.String, "0");
dsRpt01.SelectCommand = strSQL;
ReportViewer1.LocalReport.DataSources.Clear();
ReportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource("dsPreOrder", dsRpt01));
ReportViewer1.LocalReport.Refresh();

到這邊,提供更活用的方法指定資料給報表。
但進入報表頁面時,若尚未指定資料來源執行個體給報表資料來源,
不想出現這段字,只要在報表的ReportError事件中,加入 e.Handled = true; 即可。
也可以在ReportError事件,顯示自訂訊息。
protected void ReportViewer1_ReportError(object sender, Microsoft.Reporting.WebForms.ReportErrorEventArgs e)
{
    if (e.Exception.Message.Contains("rsReportParameterTypeMismatch"))
        ReportErrorMessage.Text = e.Exception.ToString();
    else
        ReportErrorMessage.Text = BuildUnknownErrorMessage(e);
    ReportErrorMessage.Visible = true;
    e.Handled = true;
}

沒有留言:

張貼留言

技術提供:Blogger.