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_Naire、Q_Problem、Q_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[]["Title"].ToString();
lbldescr.Text = dt.Rows[]["Descr"].ToString(); int sid = ;//单选题序号
int mid = ;//多选题序号
int aid = ;//问答题序号 if (dt2.Rows.Count > )
{
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 == )
{
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 + ;
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 == )
{
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 + ;
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();
txb.Height = Unit.Pixel(); if (aid == )
{
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 + ;
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 = ; i < p.length; i++)
{
if (p[i].checked)
{
v = v + p[i].name.split('$')[] + "." + p[i].value + ",";
}
}
var t = document.getElementsByTagName("textarea");
for (var i = ; i < t.length; i++)
{
/*处理输入中的"."*/
v = v + t[i].id + "." + t[i].value.toString().split('.').join('') + ",";
}
v = v.substring(, v.length - );
return v;
} //判断是否填写完整
function CheckSelect()
{
/*
在使用indexOf方法前,执行一下下面的js,
原理就是如果发现数组没有indexOf方法,会添加上这个方法
*/
if (!Array.prototype.indexOf)
{
Array.prototype.indexOf = function (elt /*, from*/)
{
var len = this.length >>> ;
var from = Number(arguments[]) || ;
from = (from < ) ? Math.ceil(from) : Math.floor(from);
if (from < )
from += len;
for (; from < len; from++)
{
if (from in this && this[from] === elt)
return from;
}
return -;
};
}
/*
*/
var ok = false;//完成标志
var no = new Array();//应完成项
var nn = new Array();//已完成项
var s = document.getElementsByTagName('input');//选择项
for (var i = ; i < s.length; i++)
{
var n = s[i].name.split('$')[].toString(); if (no.indexOf(n) < && s[i].type == "radio")
{
no.push(n)
}
if (no.indexOf(n) < && s[i].type == "checkbox")
{
no.push(n)
}
if (s[i].checked && nn.indexOf(n) < && s[i].type == "radio")
{
nn.push(n);
}
if (s[i].checked && nn.indexOf(n) < && s[i].type == "checkbox")
{
nn.push(n);
}
}
var t = document.getElementsByTagName("textarea");
for (var i = ; i < t.length; i++)
{
var m = t[i].name.split('$')[];
if (no.indexOf(m) < )
{
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代表成功
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代表成功
var res = xmlhttp.responseXML; //得到WebService传回的结果
var strJSON = res.childNodes[].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="width: 25%">
</td>
<td align="center" style="font-size: larger; font-weight: bold">
<asp:Label ID="lbltitle" runat="server"></asp:Label>
</td>
<td style="width: 25%">
</td>
</tr>
<tr>
<td style="width: 25%">
</td>
<td align="left" class="">
<asp:Label ID="lbldescr" runat="server"></asp:Label>
</td>
<td style="width: 25%">
</td>
</tr>
<tr>
<td style="width: 25%">
</td>
<td>
<hr style="border: 1px dotted #036" />
</td>
<td style="width: 25%">
</td>
</tr>
<tr>
<td style="width: 25%">
</td>
<td align="left">
<asp:Panel ID="Panel1" runat="server">
</asp:Panel>
</td>
<td style="width: 25%">
</td>
</tr>
<tr>
<td style="width: 25%">
</td>
<td>
<hr style="border: 1px dotted #036" />
</td>
<td style="width: 25%">
</td>
</tr>
<tr>
<td style="width: 25%">
</td>
<td align="left">
<input type="button" value="提交" onclick="Insert()" />
<input type="button" value="重置" onclick="javascript:location.reload()" />
</td>
<td style="width: 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 > )
{
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

简单版问卷调查系统(Asp.Net+SqlServer2008)的更多相关文章

  1. 下载文件时-修改文件名字 Redis在Windows中安装方法 SVN安装和使用(简单版) WinForm-SQL查询避免UI卡死 Asp.Net MVC Https设置

    下载文件时-修改文件名字   1后台代码 /// <summary> /// 文件下载2 /// </summary> /// <param name="Fil ...

  2. 一个简单的CS系统打包过程图文版

    一个简单的CS系统打包过程图文版 1.     打包内容 1.1.  此次打包的要求和特点 主工程是一个CS系统: 此CS系统运行的先决条件是要有.Net Framework 3.5: 主工程安装完成 ...

  3. 【小型系统】简单的刷票系统(突破IP限制进行投票)

    一.前言 相信大家平时肯定会收到朋友发来的链接,打开一看,哦,需要投票.投完票后弹出一个页面(恭喜您,您已经投票成功),再次点击的时候发现,啊哈,您的IP(***.***.***.***)已经投过票了 ...

  4. 简单的刷票系统(突破IP限制进行投票) (转)

    前言 相信大家平时肯定会收到朋友发来的链接,打开一看,哦,需要投票.投完票后弹出一个页面(恭喜您,您已经投票成功),再次点击的时候发现,啊哈,您的IP(***.***.***.***)已经投过票了,不 ...

  5. SLAM+语音机器人DIY系列:(一)Linux基础——2.安装Linux发行版ubuntu系统

    摘要 由于机器人SLAM.自动导航.语音交互这一系列算法都在机器人操作系统ROS中有很好的支持,所以后续的章节中都会使用ROS来组织构建代码:而ROS又是安装在Linux发行版ubuntu系统之上的, ...

  6. 第三周 构造一个简单的Linux系统MenuOS

    一.   Linux内核源代码简介 稳定版内核:Linux-3.18.6 Linux内核源代码的目录结构: arch目录:在Linux内核源代码里占有的比重很大,因为Linux内核支持很多的体系结构, ...

  7. 关于Unity中旧版动画系统的使用

    Unity在5.X以后,有一个旧版的动画系统和新版的动画系统. 新版的动画系统是使用Unity动画编辑器来调的,调动画和控制动画 旧版的动画系统是用其他的第三方软件调好后导出到一个FBX文件里面,就是 ...

  8. 拦截导弹简单版(读入一串整数时getline(cin,s) stringstream is(s);)

    拦截导弹简单版 时间限制: 1 Sec  内存限制: 128 MB提交: 40  解决: 16[提交][状态][讨论版][命题人:外部导入] 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系 ...

  9. 动手写一个简单版的谷歌TPU-指令集

    系列目录 谷歌TPU概述和简化 基本单元-矩阵乘法阵列 基本单元-归一化和池化(待发布) TPU中的指令集 SimpleTPU实例: (计划中) 拓展 TPU的边界(规划中) 重新审视深度神经网络中的 ...

随机推荐

  1. 【Android】 PopupWindow使用小结

        PopupWindow的很多用法网上比较多,我就不做过多解释了,只说下可能会遇到的问题,以及解决办法: 1.PopupWindow中的listview无响应 这个主要是因为show写在了set ...

  2. [ionic开源项目教程] - 第6讲 过滤器filter的使用

    过滤器filter的使用 1.回顾 再熟悉一下tab1.html的代码: <div class="list"> <a ng-repeat="item i ...

  3. volley(4) 请求参数:data:[ { bar_remain:XX , bar_code:"XX" , bar_id: XX}], method:GET

    1. 来自于WHCombineBatchFragment.java 2.部分代码 ).).).).port + Url.LABELPRINT + "?data="+strPrint ...

  4. BZOJ 1787 紧急集合

    LCA.注意细节. #include<iostream> #include<cstdio> #include<cstring> #include<algori ...

  5. ecms_任意页面调用单独的栏目

    <a href="<?=$class_r[58]['classpath']?>"> <?=$class_r[58]['classname']?> ...

  6. 【解题报告】POJ-1106 Transmitters

    原题地址:http://poj.org/problem?id=1106 题目大意: 给定一些平面的点以及一个圆心和半径,过圆心作一个半圆,求点在半圆中点最多多少个. 解题思路: 首先将给定点中和圆心的 ...

  7. MYSQL建立索引需要注意几点

    1.建立索引的时机:若表中的某字段出现在select.过滤.排序条件中,为该字段建立索引是值得的.2.对于like '%xxx'的模糊查询,普通的索引是无法满足的,需要建立全文索引.3.对于有多个条件 ...

  8. ANDROID模拟器访问本地WEB应用

    一个早上就是想让android的模拟器可以访问到web的应用程序,但是一直是不可以,弄的不知所措. 在一般的Java Web程序开发中,我们通常使用localhost或者127.0.0.1来访问本机的 ...

  9. aspose.word 在书签处插入符号

    doc.Range.Bookmarks["CBJYQQDFS110"].Text = ""; Aspose.Words.DocumentBuilder buil ...

  10. Oracle的函数返回表类型(转)

    在SQL Server中有表变量,可以在function中方便地返回,习惯SQL Server或者需要把脚本从SQL Server转到Oracle中的朋友可以都会碰到这个问题. Oracle的func ...