zoukankan      html  css  js  c++  java
  • ASP.NET+d3.js实现Sqlserver数据库的可视化展示

    效果:

    数据库端:

    前端展示:

    实现原理:

    1.在数据段建立两个存储过程

      queryUserAnsawer(id) 根据用户ID返回每一题的得分,主要是bcp exe时不能直接在sqlserver中执行sql查询语句,只能先调用存储过程

      exportUserAnsawer(id,filepath,re)根据指定的ID调用queryUserAnsawer,根据物理路径导出csv文件,re用来判断导出是否成功

    2.使用aps.net的cs文件生成filepath,然后调用exportUserAnsawer导出文件

    3.使用d3.js获取导出的csv文件,然后可视化显示。可查看我之前的文章:

    使用d3.v5实现条形图

    使用d3.v5实现饼状图

    使用d3.v5实现折线图与面积图

    源码及分析:

    1.sql存储过程的建立(导出user的总分到CSV文件.sql)

    Use 你的数据库名
    go
    --创建存储过程,根据userID返回每一题的分值
    
    if exists (SELECT * FROM sysobjects    WHERE name='queryUserAnsawer')
        drop proc exportQueryUserAnsawer
    go
     create   proc   queryUserAnsawer
     @id int    
      as 
        --这里可以自定义sql语句
      select 题库.题编号 题编号, (选项一分值*A+选项二分值*B+选项三分值*C+选项四分值*D) 总分 from  dbo.会员答案,题库 WHERE  会员编号=@id and 会员答案.题编号=题库.题编号
    go  
    
    
    --调用存储过程exportQueryUserAnsawer
     exec 你的数据库名..queryUserAnsawer 1
     
     
     
    -- 创建函数,根据userID返回每一题的总分,并将其保存到自定义CSV的文件中
    if exists (SELECT * FROM sysobjects    WHERE name='exportUserAnsawer')
        drop proc exportUserAnsawer
    go
     
    
    create   proc   exportUserAnsawer
    (
        @id int  ,@filepath varchar(8000),--输入参数
        @re int output --输出参数
    )
      as   
        declare   @s   varchar(8000)
        --csv文件的表头,你也可以自定义表头,但是为了与前端d3.js访问,直接就data1,data2了set @s='echo data1,data2>"'+@filepath+'"' 
        exec   master..xp_cmdshell  @s,no_output 
        --导出csv文件到temp目录
        set   @s='bcp   "exec 数据库名..queryUserAnsawer '+cast(@id as varchar(50))+'" queryout "'+'"%temp%	emp.csv"'+'"   /c /t,  /U"登录名"   -P"密码" /S 服务器名'     
        exec   master..xp_cmdshell   @s ,no_output 
        --将temp目录下的csv文件与之前的csv文件的表头合并
        set @s='more %temp%	emp.csv >>"'+@filepath+'"'
        exec   master..xp_cmdshell   @s ,no_output 
        --删除temp目录下的csv文件
        exec   master..xp_cmdshell   'del %temp%	emp.csv' ,no_output 
        --返回执行结果
        set @re=1 --如果可以执行这一句代表之前的语句没有报错
    go
    
    --调用存储过程exportUserAnsawer
     --F:Datadata.csv
    declare @w int
    exec 数据库名..exportUserAnsawer 5, 'F:Datadata.csv' ,@w output
    --PRINT '执行结果:'+CONVERT(varchar(20),@w)
    select @w as '返回值'

    2.在网站目录下的app_code创建一个用于导出文件的类(DB.cs)

    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;
    
    /// <summary>
    /// DB 的摘要说明
    /// </summary>
    public class DB
    {
        public SqlConnection Con = new SqlConnection();
        public SqlCommand Com = new SqlCommand();
        public SqlDataAdapter Da = new SqlDataAdapter();
        public DataSet Ds = new DataSet();
    
        public DB()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //        
        }
        //定义一个用于返回数据库连接字符串的方法
        public String GetConnectionString()
        {
            String ConStr;
            //  ConStr = System.Configuration.ConfigurationManager.AppSettings.Get("con").ToString();
    
           //  ConStr = System.Configuration.ConfigurationManager.ConnectionStrings["textconnectionstring"].ToString();
           ConStr = System.Configuration.ConfigurationManager.ConnectionStrings["连接名"].ToString();
            return ConStr;
        }
    
        //根据userID返回每一题的总分,并将其保存到自定义CSV的文件中
        //调用存储过程exportUserAnsawer
        public bool exportQueryUserAnsawer(int id, String filepath) {
            int re = 0;
    
            try
            {
                Con.ConnectionString = GetConnectionString();
                //打开连接
                Con.Open();
                //调用存储过程
                Com = new SqlCommand("exportUserAnsawer", Con);
                //设置命令的类型为存储过程 
                Com.CommandType = CommandType.StoredProcedure;
                // 设置参数 
                Com.Parameters.Add("@id", SqlDbType.Int);
                Com.Parameters.Add("@filepath", SqlDbType.VarChar);
                // 注意输出参数要设置大小,否则size默认为0
                Com.Parameters.Add("@re", SqlDbType.Int, 10);
                // 设置参数的类型为输出参数,默认情况下是输入, 
                Com.Parameters["@re"].Direction = ParameterDirection.Output;
                // 为参数赋值
                Com.Parameters["@id"].Value = id;
                Com.Parameters["@filepath"].Value = filepath;
                // 执行 
                Com.ExecuteNonQuery();
                // 得到输出参数的值,把赋值给re,注意,这里得到的是object类型的,要进行相应的类型转换
                re = (int)Com.Parameters["@re"].Value;
                if (re == 1) return true;
                else return false;
            }
            catch (Exception e){
               // Console.WriteLine(e.ToString());
                return false;
            }
    
        }
    
    }

    3.在后端(测试结果.cs)文件中,创建文件名,路径,用户ID。这些变量可以从其他页面的Session中获取,我这里就写死了(方便演示)。

    测试结果.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class _Default : System.Web.UI.Page
    {
        String filepath=null;
        String userID = null;
        String username = null;
        protected void Page_Load(object sender, EventArgs e)
        {
            userID = ""+5;
            username = "clientuser1";
    
            //插入数据完成后导出csv文件
            filepath = getFilePath(username, userID);
            DB db2 = new DB();
            if (db2.exportQueryUserAnsawer(Convert.ToInt16(userID), filepath))
            {
                Response.Write("<script>alert('保存文件成功');</script>");
            }
            else
            {
                Response.Write("<script>alert('⚠保存文件失败');</script>");
    
            }
            //转相对路径
            filepath = urlconvertor(filepath);
    
            //以上变量可从session中获取
            //try
            //{
            //    username = Session["ClientUsername"].ToString();
            //    userID = Session["ClientUserID"].ToString();
            //    filepath = Session["FliePath"].ToString();
            //    filepath = urlconvertor(filepath);
            //   // Response.Write(filepath + "<br/>");
            //}
            //catch
            //{
            //    Response.Write("<script>alert('请先登录!');;window.location.href='登录.aspx';</script>");
            //    return;
            //}
    
            //设置以下属性是为了,实现与js数据交互
            this.name.Text = username;
            this.name.ToolTip = username;
            this.path.ToolTip = filepath;
        }
    
        //退出登录
        protected void Button1_Click(object sender, EventArgs e)
        {
            Session.Clear();
            Response.Redirect("登录.aspx");
        }
    
         //生成文件物理路径 如下
        //F:DemoDatausername_5_answer_2019-05-08_18-29-48-792.csv
    
        protected String getFilePath(String username,String userID ) {
            String year = DateTime.Now.Year.ToString();
            String mouth = DateTime.Now.Month.ToString();
            String day = DateTime.Now.Day.ToString();
            String houre = DateTime.Now.Hour.ToString();
            String minute = DateTime.Now.Minute.ToString();
            String second = DateTime.Now.Second.ToString();
            String millsecond = DateTime.Now.Millisecond.ToString();
            if (Convert.ToInt16(mouth) < 10) mouth = "0" + mouth;
            if (Convert.ToInt16(day) < 10) day = "0" + day;
            String date = year + "-" + mouth + "-" + day + "_" + houre + "-" + minute + "-" + second + "-" + millsecond;
            //Response.Write(date);
    
            //插入完成后导出csv文件
            filepath = "\Data\" + username + "_" + userID + "_answer_" + date + ".csv";
            filepath = urlconvertorlocal(filepath);
            return filepath;
        }
    
        //转绝对路径
        private string urlconvertorlocal(string url)
        {
            string tmpRootDir = Server.MapPath(System.Web.HttpContext.Current.Request.ApplicationPath.ToString());//获取程序根目录
            string reurl = tmpRootDir + url.Replace(@"/", @"/"); //转换成绝对路径
            return reurl;
        }
        //本地路径转换成URL相对路径
        private string urlconvertor(string url)
        {
            string tmpRootDir = Server.MapPath(System.Web.HttpContext.Current.Request.ApplicationPath.ToString())+"\";//获取程序根目录
            string reurl = url.Replace(tmpRootDir, ""); //转换成相对路径
            reurl = reurl.Replace("\", "/");
            return reurl;
        }
        
    }

    4.前端代码

    测试结果.aspx

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="测试结果.aspx.cs" Inherits="_Default" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>测试结果</title>
        <style type="text/css">
            .hidden
            {
                display:none
                }
            .choice
            {
                display:block
                }
        </style>
        
        <script type="text/javascript" src="js/d3.min.js"></script>
    </head>
    <body>
        
        <form id="form1" runat="server">
        <div>
            <asp:Label ID="name" runat="server" Text="username"></asp:Label>
            <%--为了c#与js交互--%>
            <asp:Label ID="path" runat="server" Text="path" class="hidden" ></asp:Label>
            <asp:Button ID="Button1" runat="server" Text="退出登录" onclick="Button1_Click" />
    
            <%--使用页面回发响应慢,使用JS控制--%>
            <div id="radio">
                <asp:RadioButton ID="RadioButton1" runat="server" Text="条形图" GroupName="g1" 
                Checked="true" 
                    />
                <asp:RadioButton ID="RadioButton2" runat="server" Text="面积图" GroupName="g1" 
                    />
                <asp:RadioButton ID="RadioButton3" runat="server" Text="柱状图" GroupName="g1" 
                    
                    />
                <asp:RadioButton ID="RadioButton4" runat="server" Text="饼状图" GroupName="g1" 
                    />
            </div>
    
            <asp:Panel ID="Pane_LineChart" runat="server" class="choice">
                <link href="css/linechart.css" type="text/css" media="screen" rel="Stylesheet" />
                <div id="linechart_container">
                    <div id="linechart">
                
                    </div>
                </div>
                <script type="text/javascript" src="js/linechart.js"></script>
            </asp:Panel>
    
            <asp:Panel ID="Panel_AreaChart" runat="server" class="hidden">
                <link href="css/areachart.css" type="text/css" media="screen" rel="Stylesheet" />
                <div id="areachart_container">
                    <div id="areachart">
                
                    </div>
                </div>
                <script type="text/javascript" src="js/areachart.js"></script>
            </asp:Panel>
    
            <asp:Panel ID="Panel_BarChart" runat="server" class="hidden">
                <link href="css/barchart.css" type="text/css" media="screen" rel="Stylesheet" />
                <div id="barchart">
                
                </div>
                <script type="text/javascript" src="js/barchart.js"></script>
            </asp:Panel>
    
            <asp:Panel ID="Panel_PieChart" runat="server" class="hidden">
                 <link href="css/piechart.css" type="text/css" media="screen" rel="Stylesheet" />
                <div id="piechart">
                
                </div>
                <script type="text/javascript" src="js/piechart.js"></script>
            </asp:Panel>
    
            
        </div>
        </form>
    
        <script type="text/javascript" src="js/radioButton.js"></script>
    </body>
    </html>
    测试结果.aspx

    我上面只写了关键代码,如果你想查看整个demo,请在这里下载

    GitHub:ASP.NET+d3.js实现Sqlserver数据库的可视化展示

  • 相关阅读:
    oracle的安装与plsql的环境配置
    Working with MSDTC
    soapui-java.lang.Exception Failed to load url
    Oracle 一个owner访问另一个owner的table,不加owner
    Call API relation to TLS 1.2
    Call API HTTP header Authorization: Basic
    VS2008 .csproj cannot be opened.The project type is not supported by this installat
    The changes couldn't be completed.Please reboot your computer and try again.
    Create DB Table View Procedure
    DB Change
  • 原文地址:https://www.cnblogs.com/feiquan/p/10842993.html
Copyright © 2011-2022 走看看