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数据库的可视化展示

  • 相关阅读:
    服务器出现大量的127.0.0.1:3306 TIME_WAIT连接 解决方法 [转载]
    phpize安装php扩展CURL
    linux位数查看
    Linux下Sublime Text 3的安装
    ECstore后台报表显示空白问题解决办法
    centos 上安装phpstorm
    Nginx禁止目录执行php文件权限
    vue 动画
    vue的路由
    组件的传值 组件之间的通讯
  • 原文地址:https://www.cnblogs.com/feiquan/p/10842993.html
Copyright © 2011-2022 走看看