将此文章发布到首页是想让大家帮助我找到问题所在,所以恳请DuDu别把我文章给转移区域!!小弟先谢过了!!
我做了个在线测试的系统。答题时是用Ajax技术来向一个数据处理页ashx页页面发送答案,然后在该ashx页面通过存储过程对答案进行提交。当本系统初次使用的时候50人考试没有任何问题,不过,自从第一次使用之后,就出现了如下的现象:
在内存512M的2003服务器系统下,人数少的的时候使用本系统进行答题时不会出现问题,可是当人数超过10左右时就会出现这样或那样的问题。或者说“某某表不存在”,或者说DataReader未关闭。可是我已经仔细研究了代码,我认为能优化的地方都已经优化了。现在实在找不出解决办法了,吐血了都快,希望大家快帮帮我啊!
我所用到的操作类的部分主要代码是这样的:
1using System;
2using System.Data;
3using System.Data.SqlClient;
4using System.Text;
5
6namespace 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
2using System.Data;
3using System.Data.SqlClient;
4using System.Text;
5
6namespace 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>
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();
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
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
16CREATE PROCEDURE dbo.pro_InsertStuAnswer
17 @RecruID int,
18 @TestID int,
19 @PaperID int,
20 @StuID int,
21 @QuestionID bigint,
22 @AnswerInfo varchar(50)
23
24AS
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
37GO
38
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
16CREATE PROCEDURE dbo.pro_InsertStuAnswer
17 @RecruID int,
18 @TestID int,
19 @PaperID int,
20 @StuID int,
21 @QuestionID bigint,
22 @AnswerInfo varchar(50)
23
24AS
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
37GO
38
1 protected dbControl objDB = dbControl.GetDBOpterator(System.Configuration.ConfigurationManager.ConnectionStrings["HDHTTestOnline_ConnectionString"].ConnectionString);
点个广告: