关于大量随机调用数据后在用分页显示中的页面信息传输问题之最佳方案(散分)
各位同道:
我在做一个网络考试系统,我采用如下方法:
考试题库有1000道题(选择题),我从其中随机调取50道,由于内容多,采用分页,每页10道。但是在学生答题中,到达下一页后上一页题的答案就必须得提交。现在我所想说的就是,从学生的角度出发,如果在提交的上一页有错误,想回去修改,但由于是随机的返回的时候上一页的题目就又是新的,请问各位有什么好的方案,能够实现在作完题后一次性提交,在返回前一页的时候上一页的内容没有变。或者哪位有其他更好的想法。请给以指点。谢谢!!!!
祝大家新年快乐!!!
问题点数:100、回复次数:20Top
1 楼ShiningstarHu(Shining_star)回复于 2003-02-02 23:12:58 得分 20
在一开始的时候就产生50道题目的题号,做一个临时表将这些随机出来的题目先存在这个临时表里。这个表的结构不需要很复杂,一个字段存题目的ID,一个字段存学生的ID,一个字段存学生的答案就好了。
最后提交的时候只要把对表里的数据进行分析就可以了。Top
2 楼earthpea(问莲根,有丝多少?莲心知为谁苦?)回复于 2003-02-03 00:01:32 得分 20
同意楼上的意见,如果不考虑停电等情况的话,还可以存在内存里,学生确定交卷后一次性存盘Top
3 楼nenu0(方枪枪)回复于 2003-02-03 09:11:59 得分 0
不错!Top
4 楼zjxgold(稻草人)回复于 2003-02-03 10:43:33 得分 20
在进入系统时就为学生建立50道题的记录集,在分页时只是按顺序分页显示罢了。Top
5 楼feitianzi(飞天子)回复于 2003-02-03 14:12:29 得分 0
谢谢各位的指点,但我还有一点想法与大家共同探讨。
1、earthpea(咦?) 说可以存在内存里,请问着如何实现。
2、如果做一个临时表,在考试开始的时候,考生将同时把随机读出来的考试题写进临时表中,如果每人50道题,有一百人考试那么将有可能在很短的时间内有5000条数据写入数据表,在答题完毕后又有5000道试题答案几乎同时写入成绩表,与此同时,在临时表中的5000道题将被清空,请问这样的操作数据库服务器会不会运行超载,如果考生更多的话数据量还将更大。请大家做一下讨论。
3、在用分页后,第一页答题完毕后,当到达第二页时第一页学生做的答案是否在进入第二页的时候要先存在临时表里边,以后的页依次类推。大家是否有其他的办法在全部作完后一起提交到学生的成绩单表中,我说的也有点矛盾,但我还是想在矛盾中找一个好点的方案。我个人觉得如果能够实现一次提交,那么学生在返回修改前面作的题时,他以前走的答案可能找不到了。希望大家能够碰发出一点火花。刮一点头脑风暴。
小弟是一名在校本科生,一个寒假忙于做系统,希望大家给我提点想法,让我作完早回家,谢谢各位大哥大姐。老前辈们,小弟给各位拜年了!!!Top
6 楼unfo(uu)回复于 2003-02-03 14:59:49 得分 0
不错不错Top
7 楼heilang4819(黑狼)回复于 2003-02-03 15:17:34 得分 0
我最近也在做这样的考试系统,不过,我没有使用分页,搂主的意见不错,俺也去尝试一下Top
8 楼iren99(kai)回复于 2003-02-03 15:29:10 得分 0
upTop
9 楼feitianzi(飞天子)回复于 2003-02-03 15:52:02 得分 0
不用分页会使页面很长的如果题少还好,多了你不会全在一个页面吧?Top
10 楼feitianzi(飞天子)回复于 2003-02-03 16:16:46 得分 0
我用了如下的程序,不知道人多了服务器的运行速度会怎么样,人少还行,我拿出来和大家共同探讨。过几天我将综合大家意见,给大家结分!我其中用了6个recordset组件,大家觉得怎么样,我本人不想用这么多,但由于涉及的表太多,只能如此,哪位有更好的着
<!--#include file="../connections/ipmist.asp"-->
<%
submit=trim(request("enter"))
num=trim(request("num"))
pwd=trim(request("pwd"))
id=trim(request("subject"))
if submit="查询分数" then response.Redirect("refer.asp?num="&num&"&"&"pwd="&pwd)
set rs=server.CreateObject("adodb.recordset")
sql="select * from exampupil where num='"&num&"' and pwd='"&pwd&"'"
rs.open sql,conn,1,1%>
<%
if rs.eof then%>
<p align="center"><font size="4" color=#ff0000>
<%response.Write("对不起!学生档案里没有您的资料,请返回检查您的学号和密码是否有误。如有疑问请速与管理员或任课老师联系!!!")%>
</font></p>
<%response.End()
end if%>
<%
session.Timeout=150
session("name")=rs("name")
set rssub=server.CreateObject("adodb.recordset")
sql="select * from exsubject where id='"&id&"'"
rssub.open sql,conn,1,1
set rspa=server.CreateObject("adodb.recordset")
sql="select * from exampaper where idsub='"&id&"'"
rspa.open sql,conn,1,1
randomize()
n=rspa.recordcount
set temrs=server.CreateObject("adodb.recordset")
sql="select * from tempaper where 1<>1"
temrs.open sql,conn,1,3
for j=1to 50 '将随机试题写如临时表
do
no=cint(n*rnd())+1
if n=0 then exit do
loop while no>n
temrs.addnew
temrs("num")=num
temrs("id")=no
temrs.update
if j=n then exit for
next
set trspa=server.CreateObject("adodb.recordset")
sql="select id,answer from tempaper where num='"&num&"'"
trspa.open sql,conn,1,3
set testrs=server.CreateObject("adodb.recordset")
sql="select * from exampaper where id='"&trspa("id")&"'"
testrs.open sql,conn,1,3%>
Top
11 楼ShiningstarHu(Shining_star)回复于 2003-02-03 17:13:06 得分 20
我不知道你为什么要用这么多Recordset,尽量使用表间的关系来做,有些东西可以通过视图来完成。你还可以通过一些较复杂的sql语言来做,用些Join之类的语句将一些原来需要两个select语句做的东西用一个select和一个recordset来完成。不过我也曾经碰到过需要许多recordset才能完成的逻辑,那时大概用了5个,最后运行时也没怎么感觉特别慢的现象。你说一下子会有5000条记录,那么你的机器配置怎么样呢?我觉得5000条不算多。而且你说的那种现象是极端情况下的,就是所有考试的人大家在同一时刻按提交按钮,这种情况的概率不是很大。不知道你有没有去参加过想CCNA CCNP之类的考试,他们做的这种考试系统在最后评分的时候也很慢的,有一次我差点当死机了。还有像那种考试尤其是你遇到考题比较多的时候,我觉得他们是一半一半来处理你所有考题的,既你考试到一半的时候,你突然觉得机器没反应像死机一样的。
earthpea(咦?) 说的存在内存里其实就是把你一些中间过程的变量放到Application或Session对象里,这样就是存在内存里啊,但是如果Server Down了,这些存在内存里的东西就Crash了。保险期间还是存在数据库里比较好。
Top
12 楼binbare(学习·学习·再学习!)回复于 2003-02-03 21:42:43 得分 0
其实只要做个存储过程或视图就行了。。。把每次随机取得的五十条数据放入一个临时表中。。。。Top
13 楼feitianzi(飞天子)回复于 2003-02-03 22:12:21 得分 0
binbare(学习·学习·再学习!)
您能给讲的稍微在清楚点吗?这个存储过程或视图在客户端如何做,或者我应该怎样编写程序,谢谢!!!Top
14 楼zuixin(醉心)回复于 2003-02-04 14:55:43 得分 20
用视图做是比较方便的。存入临时表时为了避免你所说道的
“在考试开始的时候,考生将同时把随机读出来的考试题写进临时表中,如果每人50道题,有一百人考试那么将有可能在很短的时间内有5000条数据写入数据表,在答题完毕后又有5000道试题答案几乎同时写入成绩表,与此同时,在临时表中的5000道题将被清空”
可以为每一个考生建立一个临时表,临时表的名字可以依据考生的考号而定,这样应该可以解决你所说的问题。Top
15 楼triout(笨牛)回复于 2003-02-04 16:47:36 得分 0
是呀,也只有使用随机表了Top
16 楼unfor(myes)回复于 2003-02-04 18:25:02 得分 0
uoTop
17 楼feitianzi(飞天子)回复于 2003-02-04 21:41:21 得分 0
如果每个人做一个临时表,我觉得是很浪费,如果你给每个人做一个临时表,数据库服务器的运行量也是很大的,现在我考虑只做一个临时表,想一个办法进行分批处理,给每个考生分配一段时间存储一部分数据,然后使用循环,这样考生也不至于等的心烦,程序可能运行也会优化,我还得考虑一下,大家赶快给提点意见,我准备6号结贴,现在给大家提供一个QQ的ASP技术组以做给大家的报答260823,大家加入可以共同的探讨新的好东东Top
18 楼cctvufo(紫气〓东来)回复于 2003-02-05 16:35:46 得分 0
up
Top
19 楼glonline(glonline)回复于 2003-02-07 23:17:21 得分 0
我这两天忙的晕头转向,终于把考试系统做好了
大家欣赏一下吧。
http://www.dzsw.org/newexam
管理员密码和账号都是
adminTop
20 楼jdcl2000(绝地苍狼)回复于 2003-02-10 18:01:42 得分 0
你还是这样吧,一次全部查询出来,分五个
<DIV name=考题1 style="visability:">...... </DIV>
<DIV name=考题2 style="visability:hiden">...... </DIV>
<DIV name=考题3 style="visability:hiden">...... </DIV>
<DIV name=考题4 style="visability:hiden">...... </DIV>
<DIV name=考题5 style="visability:hiden">...... </DIV>
来处理来处理,首先是第一个显示,其它的隐藏,客户端的代码来处理几个的现实切换,一次性提交,速度也快。没必要处理什么临时表,视图,那只能做在服务器端;硬是要坐在服务器端,每次提交后,相应的用户都有一个session变量来记录每页的题号即可,很简单Top




