zoukankan      html  css  js  c++  java
  • 简单版问卷调查系统(Asp.Net+SqlServer2008)

    1.系统主要涉及以下几个表 

    问卷项目表(Q_Naire) 问卷题目表(Q_Problem) 题目类型表(Q_ProblmeType)

    题目选项表(Q_Options) 调查结果表(Q_Answer) 参与用户表(Q_User)

    2.涉及的存储过程

    pNextID 获取实体表主键ID

    sp_NaireAnswer 将问卷调查的结果写入结果表(通过WebService方法调用)

    sp_NaireImport 通过导入的问卷数据生成问卷项目(根据Q_Naire_Import表中的问卷数据分别写入Q_NaireQ_ProblemQ_Options中生成问卷)

    sp_NaireResult 问卷调查结果数据集

    3.系统实现方式

    后台:主要是通过后台维护的问卷数据,根据问卷项目编号获取问卷题目以及题目类型

    然后根据题目类型在后台生成相应的控件,后台控件生成通过Asp.Net实现

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Data.SqlClient;
    using System.Data;
    
    namespace QuestionnaireSurveySystem
    {
        public partial class Naire : System.Web.UI.Page
        {
            /// <summary>
            /// 问卷编号
            /// </summary>
            public string nid = string.Empty;
            /// <summary>
            /// 用户编号
            /// </summary>
            public string uid = string.Empty;
            /// <summary>
            /// 数据库连接字符串
            /// </summary>
            private string constr = ConfigHelper.GetConfigString("System.ConnectionString");
    
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!Page.IsPostBack)
                {
                    try
                    {
                        if (Request.Params["uid"].ToString() != null && Request.Params["uid"].ToString().Trim() != "")
                        {
                            uid = Request.Params["uid"].ToString();
                        }
                        if (Request.Params["nid"].ToString() != null && Request.Params["nid"].ToString().Trim() != "")
                        {
                            nid = Request.Params["nid"].ToString();
                            //绑定题目
                            BindNaire(nid);
                        }
                    }
                    catch
                    {
                        Response.Redirect("Error.html");
                    }
                }
            }
            /// <summary>
            /// 动态生成问卷表单
            /// </summary>
            /// <param name="id">问卷项目编号</param>
            private void BindNaire(string id)
            {
                SqlConnection con = new SqlConnection(constr);
                con.Open();
                DataTable dt = new DataTable();
                DataTable dt2 = new DataTable();
                SqlDataAdapter sda = new SqlDataAdapter("SELECT b.ID AS Nid,b.Title,b.Descr,a.ID AS Pid,a.Title,d.TypeName,c.ID AS Oid,c.OptionValue FROM dbo.Q_Problem a LEFT JOIN dbo.Q_Naire b ON a.Nid=b.ID LEFT JOIN dbo.Q_Options c ON a.ID=c.Pid LEFT JOIN dbo.Q_ProblmeType d ON a.Tid=d.ID WHERE b.ID=" + id + "", con);
                sda.Fill(dt);
                SqlDataAdapter sda2 = new SqlDataAdapter("SELECT a.ID as Pid,a.Title,a.Nid,a.Tid,b.TypeName,b.Descr FROM dbo.Q_Problem a LEFT JOIN dbo.Q_ProblmeType b ON a.Tid=b.ID WHERE a.Nid=" + id + " ORDER BY a.Tid ASC", con);
                sda2.Fill(dt2);
                lbltitle.Text = dt.Rows[0]["Title"].ToString();
                lbldescr.Text = dt.Rows[0]["Descr"].ToString();
    
                int sid = 1;//单选题序号
                int mid = 1;//多选题序号
                int aid = 1;//问答题序号
    
                if (dt2.Rows.Count > 0)
                {
                    foreach (DataRow dr in dt2.Rows)
                    {
                        switch (dr["TypeName"].ToString())
                        {
                            case "单选题":
                                Label lbl = new Label();
                                lbl.Text = sid.ToString() + "" + dr["Title"].ToString();
                                RadioButtonList rbl = new RadioButtonList();
                                rbl.ID = dr["Pid"].ToString();
                                DataRow[] drs = dt.Select("Pid=" + dr["Pid"] + "");
                                foreach (DataRow drc in drs)
                                {
                                    ListItem li1 = new ListItem();
                                    li1.Text = drc["OptionValue"].ToString();
                                    li1.Value = drc["Oid"].ToString();
                                    rbl.Items.Add(li1);
                                }
                                if (sid == 1)
                                {
                                    Label lblss = new Label();
                                    lblss.Text = "单选题";
                                    lblss.Font.Bold = true;
                                    this.Panel1.Controls.Add(lblss);
                                    this.Panel1.Controls.Add(new LiteralControl("<br/>"));
                                }
                                this.Panel1.Controls.Add(lbl);
                                this.Panel1.Controls.Add(new LiteralControl("<br/>"));
                                this.Panel1.Controls.Add(rbl);
                                this.Panel1.Controls.Add(new LiteralControl("<br/>"));
                                sid = sid + 1;
                                break;
                            case "多选题":
                                Label lbl2 = new Label();
                                lbl2.Text = mid.ToString() + "" + dr["Title"].ToString();
                                CheckBoxList cbl = new CheckBoxList();
                                cbl.ID = dr["Pid"].ToString();
                                DataRow[] drs2 = dt.Select("Pid=" + dr["Pid"] + "");
                                foreach (DataRow drc in drs2)
                                {
                                    ListItem li2 = new ListItem();
                                    li2.Text = drc["OptionValue"].ToString();
                                    li2.Value = drc["Oid"].ToString();
                                    cbl.Items.Add(li2);
                                }
                                if (mid == 1)
                                {
                                    Label lblms = new Label();
                                    lblms.Text = "多选题";
                                    lblms.Font.Bold = true;
                                    this.Panel1.Controls.Add(lblms);
                                    this.Panel1.Controls.Add(new LiteralControl("<br/>"));
                                }
                                this.Panel1.Controls.Add(lbl2);
                                this.Panel1.Controls.Add(new LiteralControl("<br/>"));
                                this.Panel1.Controls.Add(cbl);
                                this.Panel1.Controls.Add(new LiteralControl("<br/>"));
                                mid = mid + 1;
                                break;
                            case "问答题":
                                Label lbl3 = new Label();
                                lbl3.Text = aid.ToString() + "" + dr["Title"].ToString();
                                TextBox txb = new TextBox();
                                txb.ID = dr["Pid"].ToString();
                                txb.TextMode = TextBoxMode.MultiLine;
                                txb.Width = Unit.Pixel(600);
                                txb.Height = Unit.Pixel(50);
    
                                if (aid == 1)
                                {
                                    Label lblas = new Label();
                                    lblas.Text = "问答题";
                                    lblas.Font.Bold = true;
                                    this.Panel1.Controls.Add(lblas);
                                    this.Panel1.Controls.Add(new LiteralControl("<br/>"));
                                }
                                this.Panel1.Controls.Add(lbl3);
                                this.Panel1.Controls.Add(new LiteralControl("<br/>"));
                                this.Panel1.Controls.Add(txb);
                                this.Panel1.Controls.Add(new LiteralControl("<br/>"));
                                aid = aid + 1;
                                break;
                        }
                    }
                }
                //关闭连接 释放资源
                con.Close();
                Dispose();
            }
        }
    }

    前台:通过JavaScript方法获取用户选择项,作为参数传递给后台WebService方法,然后调用存储过程将问卷结果写入数据库

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Naire.aspx.cs" Inherits="QuestionnaireSurveySystem.Naire" %>
    
    <!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>
        <script type="text/javascript">
              //获取问卷填写内容
              function GetRadioValue()
              {
                  var p = document.getElementsByTagName("input");
                  var v = "";
                  for (var i = 0; i < p.length; i++)
                  {
                      if (p[i].checked)
                      {
                          v = v + p[i].name.split('$')[0] + "." + p[i].value + ",";
                      }
                  }
                  var t = document.getElementsByTagName("textarea");
                  for (var i = 0; i < t.length; i++)
                  {
                      /*处理输入中的"."*/
                      v = v + t[i].id + "." + t[i].value.toString().split('.').join('') + ",";
                  }
                  v = v.substring(0, v.length - 1);
                  return v;
              }
    
              //判断是否填写完整
              function CheckSelect()
              {
                  /*
                  在使用indexOf方法前,执行一下下面的js, 
                  原理就是如果发现数组没有indexOf方法,会添加上这个方法
                  */
                  if (!Array.prototype.indexOf)
                  {
                      Array.prototype.indexOf = function (elt /*, from*/)
                      {
                          var len = this.length >>> 0;
                          var from = Number(arguments[1]) || 0;
                          from = (from < 0) ? Math.ceil(from) : Math.floor(from);
                          if (from < 0)
                              from += len;
                          for (; from < len; from++)
                          {
                              if (from in this && this[from] === elt)
                                  return from;
                          }
                          return -1;
                      };
                  }
                  /*
                  */
                  var ok = false;//完成标志
                  var no = new Array();//应完成项
                  var nn = new Array();//已完成项
                  var s = document.getElementsByTagName('input');//选择项
                  for (var i = 0; i < s.length; i++)
                  {
                      var n = s[i].name.split('$')[0].toString();
    
                      if (no.indexOf(n) < 0 && s[i].type == "radio")
                      {
                          no.push(n)
                      }
                      if (no.indexOf(n) < 0 && s[i].type == "checkbox")
                      {
                          no.push(n)
                      }
                      if (s[i].checked && nn.indexOf(n) < 0 && s[i].type == "radio")
                      {
                          nn.push(n);
                      }
                      if (s[i].checked && nn.indexOf(n) < 0 && s[i].type == "checkbox")
                      {
                          nn.push(n);
                      }
                  }
                  var t = document.getElementsByTagName("textarea");
                  for (var i = 0; i < t.length; i++)
                  {
                      var m = t[i].name.split('$')[0];
                      if (no.indexOf(m) < 0)
                      {
                          no.push(n)
                      }
                      if (t[i].value != null && t[i].value != "")
                      {
                          nn.push(n)
                      }
                  }
                  if (nn.length < no.length)
                  {
                      ok = false;
                  }
                  else
                  {
                      ok = true;
                  }
                  return ok;
              }
    
              //将填写内容写入数据库
              function Insert()
              {
                  var ok = CheckSelect();
                  if (ok)
                  {
                      var r = GetRadioValue();
                      if (r != "")
                      {
                          var f=Select();
                          if(f)
                          {
                              var uid=<%=uid %>;
                              var nid=<%=nid %>;
                              var URL = "Server/NaireService.asmx/RecordResult"
                              var Params = "uid=" + uid + "&nid="+nid+"&val=" + r + "";  //传给WebService的参数
                              var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
                              xmlhttp.Open("POST", URL, false); //用POST方法
                              xmlhttp.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                              xmlhttp.SetRequestHeader("Content-Length", Params.length);
                              xmlhttp.send(Params);
                              if (xmlhttp.Status == 200)
                              {
                                  //200代表成功
                                  alert("提交成功,谢谢您的参与和支持!");
                                  //刷新页面
                                  location.reload();
                              }
                          }
                          else{
                          alert("您已经完成问卷,不用重复提交!");
                          }
                      }
                      else
                      {
                          alert("内容不可为空!");
                      }
                  }
                  else
                  {
                      alert("所有调查项完成后才可以提交,请检查!");
                  }
              }
    
              function Select()
              {
                  var uid=<%=uid %>;
                  var nid=<%=nid %>;
                  var URL = "Server/NaireService.asmx/IsHasCarry";
                  var Params = "uid=" + uid + "&nid="+nid+""; //传给WebService的参数
                  var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
                  xmlhttp.Open("POST", URL, false); //用POST方法
                  xmlhttp.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                  xmlhttp.SetRequestHeader("Content-Length", Params.length);
                  xmlhttp.send(Params);
                  if (xmlhttp.Status == 200)
                  {
                      //200代表成功
                      var res = xmlhttp.responseXML; //得到WebService传回的结果
                      var strJSON = res.childNodes[1].text;
                      var obj = eval("(" + strJSON + ")"); //转换后的JSON对象
                      if(obj){return false;
                      }
                      else{return true;
                      }
                  }
                  else{return false;
                  }
              }
        </script>
        <style id="style1" type="text/css">
            body
            {
                background-color: #9ECBE8
            }
        </style>
    </head>
    <body>
        <form id="form1" runat="server">
        <table width="100%">
            <tr>
                <td style=" 25%">
                </td>
                <td align="center" style="font-size: larger; font-weight: bold">
                    <asp:Label ID="lbltitle" runat="server"></asp:Label>
                </td>
                <td style=" 25%">
                </td>
            </tr>
            <tr>
                <td style=" 25%">
                </td>
                <td align="left" class="">
                    <asp:Label ID="lbldescr" runat="server"></asp:Label>
                </td>
                <td style=" 25%">
                </td>
            </tr>
            <tr>
                <td style=" 25%">
                </td>
                <td>
                    <hr style="border: 1px dotted #036" />
                </td>
                <td style=" 25%">
                </td>
            </tr>
            <tr>
                <td style=" 25%">
                </td>
                <td align="left">
                    <asp:Panel ID="Panel1" runat="server">
                    </asp:Panel>
                </td>
                <td style=" 25%">
                </td>
            </tr>
            <tr>
                <td style=" 25%">
                </td>
                <td>
                    <hr style="border: 1px dotted #036" />
                </td>
                <td style=" 25%">
                </td>
            </tr>
            <tr>
                <td style=" 25%">
                </td>
                <td align="left">
                    <input type="button" value="提交" onclick="Insert()" />
                    <input type="button" value="重置" onclick="javascript:location.reload()" />
                </td>
                <td style=" 25%">
                </td>
            </tr>
        </table>
        </form>
    </body>
    </html>

    WebService代码

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Services;
    using System.Data.SqlClient;
    using System.Data;
    
    namespace QuestionnaireSurveySystem.Server
    {
        /// <summary>
        /// NaireService 的摘要说明
        /// </summary>
        [WebService(Namespace = "http://tempuri.org/")]
        [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
        [System.ComponentModel.ToolboxItem(false)]
        // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
        [System.Web.Script.Services.ScriptService]
        public class NaireService : System.Web.Services.WebService
        {
    
            //[WebMethod]
            //public string HelloWorld()
            //{
            //    return "Hello World";
            //}
           private string constr = ConfigHelper.GetConfigString("System.ConnectionString");
            /// <summary>
            /// 判断用户是否有进行问卷
            /// </summary>
            /// <param name="uid"></param>
            /// <param name="nid"></param>
            /// <returns></returns>
            [WebMethod(Description = "判断用户是否有进行问卷")]
            public bool IsHasCarry(string uid, string nid)
            {
                SqlConnection con = new SqlConnection(constr);
                con.Open();
                DataTable dt = new DataTable();
                SqlDataAdapter sda = new SqlDataAdapter("SELECT ID FROM Q_Answer WHERE Uid=" + uid + " AND Nid=" + nid + "", con);
                sda.Fill(dt);
                con.Close();
                if (dt.Rows.Count > 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
    
            /// <summary>
            /// 将问卷调查的结果写入数据库
            /// </summary>
            /// <param name="uid">用户编号</param>
            /// <param name="nid">项目编号</param>
            /// <param name="val">结果字符串</param>
            /// <returns></returns>
            [WebMethod(Description = "将问卷调查的结果写入数据库")]
            public int RecordResult(string uid, string nid, string val)
            {
                SqlConnection con = new SqlConnection(constr);
                con.Open();
                SqlCommand cmd = new SqlCommand("exec sp_NaireAnswer " + uid + "," + nid + ",'" + val + "'", con);
                int i = cmd.ExecuteNonQuery();
                con.Close();
                return i;
    
            }
        }
    }

    结束语:

    时间关系,只是作了简单的问卷展示页面,其他维护性页面都没有做。直接在后台数据库处理的。有兴趣的朋友可以完善下。写的很粗糙,欢迎大神拍砖。

    补一张效果图

    源码下载

    转载请说明出处 http://www.cnblogs.com/hhwan/p/4108358.html

  • 相关阅读:
    二进制文件分析工具-hexdump使用指南
    麦克风阵列技术-beaforming开源算法源码分析
    CMake的作用和价值--概念简介
    matlab load函数用法 实例
    SparkSQL(3.1.1)源码分析
    Spark SQL: Relational Data Processing in Spark (SIGMOD’15)
    论文解析 -- QuickSel: Quick Selectivity Learning with Mixture Models (SIGMOD’20)
    Is Query Optimization a “Solved” Problem? (2014, Guy Lohman)
    Adaptive Statistics in Oracle 12c(PVLDB 2017)
    论文解析 -- A Survey on Advancing the DBMS Query Optimizer: Cardinality Estimation, Cost Model, and Plan Enumeration (Data Science and Engineering 2021)
  • 原文地址:https://www.cnblogs.com/hhwan/p/4108358.html
Copyright © 2011-2022 走看看