zoukankan      html  css  js  c++  java
  • 实现SQL2008 Reporting Service的表单验证

     

    前提:已有成功部署的SQL2008报表(2005也行,不过调的webservice可能不一样,我直接从2008开始学的),并在VS2005下新建一个网站。

    完成功能:今天看了蜡人张的博文http://www.cnblogs.com/waxdoll/archive/2006/07/30/463114.html得到启发,简单调试了一下,完成SQL2008 Reporting Service下的表单验证。
    实现思路:过程如下:用户输入用户名、密码-》通过数据库验证用户-》若成功,则返回该用户Windows下的身份凭证-》用返回的凭证登录报表服务器-》返回报表项-》遍历该用户权限,若有读权限,则在treeview上绑定一个节点-》验证过程完毕!为简单起见,我略去数据库验证这一环,要添上也非常简单,建一个用户表就行,不过里面要加上从当前用户到windows用户或组的映射,所谓映射其实就是让该用户名与windows用户的帐户、密码做个对应,后面添加两个字段就行。控制用户权限时直接更该对应的windows用户就行。
    过程截图:

    一、添加web引用,URL:http://localhost/reportserver/reportservice2005.asmx?wsdl,点击添加引用。注意:此处地址跟蜡人张博文中的不一样。有心情可以看下该webservice提供的方法,有的将会在以后的应用中用到。


    二、在页面上放上一个Table、两个TextBox、一个Button、一个Treeview、一个ReportViewer,在此只做简单介绍,故空间ID都不改了,大家在实际项目中可千万要记得改。界面也不作修饰了,截图如下。


    三、进入代码编辑界面,双击Button进入代码编辑页面,输入如下代码:

    #region//用户登录并更新树

    protected void Button1_Click(object sender, EventArgs e)

    {

    //实现接口ICredentials,在此可通过数据库验证用户的登录,并返回该用户所映射到的windows帐户、密码,并以此帐户、密码登录报表服务器,关键就在这

    ICredentials credentials = new NetworkCredential(TextBox1.Text,TextBox2.Text, "esint-9eb6bad34");

    rs.Credentials = credentials;

    TreeView1.Nodes.Clear();

    try

    {

    this.AddNodes(this.TreeView1.Nodes, "/");

    }

    catch

    {

    Response.Write("<script>alert('您的登录名或密码有误!')</script>");

    }

    }

    #endregion

    补充:需添加using引用:using System.Web.Services.Protocols;using System.Net;

    四、添加方法AddNodes完成绑定树节点的操作,代码如下:

    #region//给树添加节点

    private void AddNodes(TreeNodeCollection tnc, string nodepath)

    {

    //返回所有报表项 的集合

    localhost.CatalogItem[] items = rs.ListChildren(nodepath, true);

    TreeNode tn = new TreeNode();//声明一个空节点,存放文件夹节点

    for (int i = 0; i <items.Length; i++)

    {

    /*返回该用户的所有权限,管理员的权限项分别为:Create Folder、Delete、Read Properties、

    * Update Properties、Create Report、Create Resource、Create data source、Create Model、

    * Read Security Policies、Update Security Policies */

    string[] perm = rs.GetPermissions(items[i].Path);

    //添加节点,该方法只限于文件夹嵌套层次为一层的情况下

    foreach (string per in perm)

    {

    //判断是否拥有度权限

    if (per == "Read Properties")

    {

    //如果该项为文件夹

    if (items[i].Type == localhost.ItemTypeEnum.Folder)

    {

    tn = new TreeNode(items[i].Name, "folder" + items[i].Path, "folder.gif", "", "");

    tnc.Add(tn);

    }

    else if (items[i].Type == localhost.ItemTypeEnum.Report)

    {

    //在已添加的文件夹节点就爱如报表节点

    tn.ChildNodes.Add(new TreeNode(items[i].Name, "report" + items[i].Path, "report.gif", "", ""));

    tn.Expanded = false;//设置文件夹节点初始为闭合状态

    }

    }

    }

    }

    items = null;//清空项

    }

    #endregion

    五、加入点击树的事件代码:

    #region//完成点击treeview的事件

    protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)

    {

    //显示报表

    if (TreeView1.SelectedNode != null)

    {

    string type = TreeView1.SelectedNode.Value.Substring(0, 6);

    if (type == "report")

    {

    this.ReportViewer1.Visible = true;

    this.ReportViewer1.ProcessingMode = Microsoft.Reporting.WebForms.ProcessingMode.Remote;

    this.ReportViewer1.ServerReport.ReportServerUrl = new Uri("http://localhost/reportserver");

    this.ReportViewer1.ServerReport.ReportPath = TreeView1.SelectedNode.Value.Substring(6);

    }

    }

    }

    #endregion

    六、预览一下

    前提说明:已创建了三个用户,一个Administrator为管理员,ReportUser为用户,有除AC目录外的权限,ReportUser2为用户,只有浏览目录的权限。

    首先管理员登录,截图如下:


    然后用ReportUser登录,截图如下,看是不是没有AC目录了。


    最后用ReportUser2登录,该用户只有浏览目录的权限,所以目录前面没有加号。不好意思,忘了添加隐藏报表的语句了。


    总结:算是一个简单教程吧,也是本人博客的开篇,以后学习过程中我将会把自己实现的一些比较有特点的功能跟大家做交流,如果大家有更好的方法,也希望能分享一下,毕竟我还刚开始学。博客园是个非常好的学习平台,大家要好好利用。

  • 相关阅读:
    30个在线学习设计与开发的站点
    马云:你的一生到底该往哪个方向走?
    那些争议最大的编程观点
    Python 标识符
    Python 环境搭建
    Python 简介
    PyCharm 使用技巧
    Shell脚本———— /dev/null 2>&1详解
    linux 创建连接命令 ln -s 软链接
    scp命令详解
  • 原文地址:https://www.cnblogs.com/wallis0922/p/2134940.html
Copyright © 2011-2022 走看看