[有人帮我说明了原因,明天找人测试一下]紧急求助!!(请您帮看看我的一个在线考试系统的部分代码是否有问题啊?)

将此文章发布到首页是想让大家帮助我找到问题所在,所以恳请DuDu别把我文章给转移区域!!小弟先谢过了!!

我做了个在线测试的系统。答题时是用Ajax技术来向一个数据处理页ashx页页面发送答案,然后在该ashx页面通过存储过程对答案进行提交。当本系统初次使用的时候50人考试没有任何问题,不过,自从第一次使用之后,就出现了如下的现象:
    在内存512M的2003服务器系统下,人数少的的时候使用本系统进行答题时不会出现问题,可是当人数超过10左右时就会出现这样或那样的问题。或者说“某某表不存在”,或者说DataReader未关闭。可是我已经仔细研究了代码,我认为能优化的地方都已经优化了。现在实在找不出解决办法了,吐血了都快,希望大家快帮帮我啊!
我所用到的操作类的部分主要代码是这样的:

  1 using  System;
  2 using  System.Data;
  3 using  System.Data.SqlClient;
  4 using  System.Text;
  5
  6 namespace  DataAccess
  7 {
  8    public class dbControl
  9    {
 10        private static dbControl m_objDBcontrol = null;
 11
 12        private static string strSql;//数据库连接字符串
 13        private SqlConnection myConn = null;
 14
 15        构造函数
 21
 22        实例化数据库操作对象
 45
 46        通过带有参数的Sql语句获取DataReader[推荐使用此方法], SqlLDataReader类型
 80
 81        通过带有参数的Sql语句获取DataTable[推荐使用此方法],返回值:DataTable类型
123
124        执行返回值不是表的的存储过程
152
153        执行返回值为单个数据表的存储过程
208
209        执行具有输出参数的存储过程[我用的就是此方法!!]
245
246        Connection对象处理
271
272    }

273}

274

然后我调用该类时这样调用:在一个基类中生成该对象,然后各个需要进行数据库操作的页面继承此基类

1   protected  dbControl objDB  =  dbControl.GetDBOpterator(System.Configuration.ConfigurationManager.ConnectionStrings[ " HDHTTestOnline_ConnectionString " ].ConnectionString);


连接字符串是这样的:

1 < connectionStrings >
2          < add  name ="TestOnline_ConnectionString"  connectionString ="server=192.168.0.79;database=TestOnline;user=sa;password=sa;" />
3   </ connectionStrings >


以下是答题页面的代码:
答题页面我是这样设计的:每道题目上有一个“保存”按钮,用户需要每答一题点击一次它,点击保存按钮时触发如下事件:

 1  postTarget = " PaperDealHandler.ashx?questionid= "   +  escape(questionid)  +   " &answer= "   +  escape(answer);
 2             
 3              // 将要处理的题目的ID及其答案提交到数据处理程序中
 4              var  wRequest = new  Sys.Net.WebRequest();
 5             wRequest.set_url(postTarget);
 6             wRequest.set_httpVerb( " POST " );
 7             
 8             timer = window.setTimeout( " showSaving() " ,timelength); // 设置timelength秒之后显示"正在保存"的timeout
 9             
10             wRequest.add_completed(OnWebRequestCompleted); // 提交完成时的事件
11             wRequest.invoke();

以下是ashx页面的数据处理的代码:
 1   try
 2              {
 3                string RecruId = context.Session["RecruId"].ToString();//招聘ID
 4                string TestID = context.Session["TestID"].ToString();//测试ID
 5                string PaperID = context.Session["PaperID"].ToString();//试卷ID
 6                string StuID = context.Session["StuID"].ToString();//考生编号
 7
 8                //Session["lastTime"]用来保存考生上次提交试题的时间
 9                if (Session["lastTime"!= null)
10                {
11                    DateTime dtBegin = DateTime.Parse(Session["lastTime"].ToString());
12                    DateTime dtEnd = DateTime.Now;
13
14                    TimeSpan ts;
15                    ts = dtEnd.Subtract(dtBegin);
16
17                    SqlParameter[] spTimeSpan = new SqlParameter[7];
18                    spTimeSpan[0= new SqlParameter("@RecruID", RecruId);
19                    spTimeSpan[1= new SqlParameter("@TestID", TestID);
20                    spTimeSpan[2= new SqlParameter("@PaperID", PaperID);
21                    spTimeSpan[3= new SqlParameter("@StuID", StuID);
22                    spTimeSpan[4= new SqlParameter("@SpentHours", ts.Hours);
23                    spTimeSpan[5= new SqlParameter("@SpentMinutes", ts.Minutes);
24                    spTimeSpan[6= new SqlParameter("@SpentSeconds", ts.Seconds);
25
26                    objDB.sp_Execute("pro_stuAnswerTime", DataAccess.dbControl.sp_ReturnType.AffectedRowsCount, spTimeSpan);
27                    //重新将当前时间同仁给Session["lastTime"];
28                    Session["lastTime"= DateTime.Now.ToString();
29                }

30
31                SqlParameter[] spTemp = new SqlParameter[6];
32                spTemp[0= new SqlParameter("@RecruID", RecruId);
33                spTemp[1= new SqlParameter("@TestID", TestID);
34                spTemp[2= new SqlParameter("@PaperID", PaperID);
35                spTemp[3= new SqlParameter("@StuID", StuID);
36                spTemp[4= new SqlParameter("@QuestionID", QuestionID);
37                spTemp[5= new SqlParameter("@AnswerInfo", Answer);
38
39                int i = (int)objDB.sp_Execute("pro_InsertStuAnswer", DataAccess.dbControl.sp_ReturnType.AffectedRowsCount, spTemp);
40

pro_InsertStuAnswer存储过程的代码:
 1 /*
 2  存储过程名:pro_InsertStuAnswer
 3  输入参数:
 4    @RecruID 招聘ID
 5    @TestID  考试ID
 6    @PaperID 试卷ID
 7    @StuID   考生ID
 8    @QuestionID 问题ID
 9    @AnswerInfo 问题答案
10  输出参数:
11    @@ROWCOUNT    操作影响的行数
12  用途:
13  对某生的某次考试的成绩的添加和修改
14*/

15
16 CREATE   PROCEDURE  dbo.pro_InsertStuAnswer
17      @RecruID   int ,
18      @TestID   int ,
19      @PaperID   int ,
20      @StuID   int ,
21      @QuestionID   bigint ,
22      @AnswerInfo   varchar ( 50 )
23     
24 AS
25      if  ( select   count ( * from   tb_StuAnswers  where  RecruID = @RecruID   and   TestID = @TestID   and  PaperID = @PaperID   and  StuID = @StuID   and  QuestionID = @QuestionID ) = 0
26          begin
27              -- 没有记录,则向表中插入该条记录
28              insert   into  Tb_StuAnswers(RecruID,TestID,PaperID,StuID,QuestionID,AnswerInfo)  values ( @RecruID , @TestID , @PaperID , @StuID , @QuestionID , @AnswerInfo );
29          end
30      else
31          begin
32          -- 数据库已有该记录,则说明考生为修改答案
33              update  Tb_StuAnswers  set  AnswerInfo = @AnswerInfo   where   RecruID = @RecruID   and   TestID = @TestID   and  PaperID = @PaperID   and  StuID = @StuID   and  QuestionID = @QuestionID     
34          end
35      return   @@ROWCOUNT ;
36      RETURN
37 GO
38
1   protected  dbControl objDB  =  dbControl.GetDBOpterator(System.Configuration.ConfigurationManager.ConnectionStrings[ " HDHTTestOnline_ConnectionString " ].ConnectionString);

你可能感兴趣的:(测试)