将此文章发布到首页是想让大家帮助我找到问题所在,所以恳请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![](/Images/OutliningIndicators/None.gif)
6
namespace DataAccess
7
{
8
public class dbControl
9
{
10
private static dbControl m_objDBcontrol = null;
11![](/Images/OutliningIndicators/InBlock.gif)
12
private static string strSql;//数据库连接字符串
13
private SqlConnection myConn = null;
14![](/Images/OutliningIndicators/InBlock.gif)
15
构造函数
21![](/Images/OutliningIndicators/InBlock.gif)
22
实例化数据库操作对象
45![](/Images/OutliningIndicators/InBlock.gif)
46
通过带有参数的Sql语句获取DataReader[推荐使用此方法], SqlLDataReader类型
80![](/Images/OutliningIndicators/InBlock.gif)
81
通过带有参数的Sql语句获取DataTable[推荐使用此方法],返回值:DataTable类型
123![](/Images/OutliningIndicators/InBlock.gif)
124
执行返回值不是表的的存储过程
152![](/Images/OutliningIndicators/InBlock.gif)
153
执行返回值为单个数据表的存储过程
208![](/Images/OutliningIndicators/InBlock.gif)
209
执行具有输出参数的存储过程[我用的就是此方法!!]
245![](/Images/OutliningIndicators/InBlock.gif)
246
Connection对象处理
271![](/Images/OutliningIndicators/InBlock.gif)
272
}
273
}
274![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/None.gif)
7
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
8
![](/Images/OutliningIndicators/InBlock.gif)
9
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
10
![](/Images/OutliningIndicators/InBlock.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/InBlock.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
45
![](/Images/OutliningIndicators/InBlock.gif)
46
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
80
![](/Images/OutliningIndicators/InBlock.gif)
81
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
123
![](/Images/OutliningIndicators/InBlock.gif)
124
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
152
![](/Images/OutliningIndicators/InBlock.gif)
153
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
208
![](/Images/OutliningIndicators/InBlock.gif)
209
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
245
![](/Images/OutliningIndicators/InBlock.gif)
246
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
271
![](/Images/OutliningIndicators/InBlock.gif)
272
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
273
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
274
![](/Images/OutliningIndicators/None.gif)
然后我调用该类时这样调用:在一个基类中生成该对象,然后各个需要进行数据库操作的页面继承此基类
1
protected dbControl objDB = dbControl.GetDBOpterator(System.Configuration.ConfigurationManager.ConnectionStrings["HDHTTestOnline_ConnectionString"].ConnectionString);
![](/Images/OutliningIndicators/None.gif)
连接字符串是这样的:
1
<connectionStrings>
2
<add name="TestOnline_ConnectionString" connectionString="server=192.168.0.79;database=TestOnline;user=sa;password=sa;"/>
3
</connectionStrings>
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
以下是答题页面的代码:
答题页面我是这样设计的:每道题目上有一个“保存”按钮,用户需要每答一题点击一次它,点击保存按钮时触发如下事件:
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();
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/None.gif)
7
![](/Images/OutliningIndicators/None.gif)
8
![](/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/dot.gif)
9
![](/Images/OutliningIndicators/None.gif)
10
![](/Images/OutliningIndicators/None.gif)
11
![](/Images/OutliningIndicators/None.gif)
以下是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![](/Images/OutliningIndicators/InBlock.gif)
8
//Session["lastTime"]用来保存考生上次提交试题的时间
9
if (Session["lastTime"] != null)
10
{
11
DateTime dtBegin = DateTime.Parse(Session["lastTime"].ToString());
12
DateTime dtEnd = DateTime.Now;
13![](/Images/OutliningIndicators/InBlock.gif)
14
TimeSpan ts;
15
ts = dtEnd.Subtract(dtBegin);
16![](/Images/OutliningIndicators/InBlock.gif)
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![](/Images/OutliningIndicators/InBlock.gif)
26
objDB.sp_Execute("pro_stuAnswerTime", DataAccess.dbControl.sp_ReturnType.AffectedRowsCount, spTimeSpan);
27
//重新将当前时间同仁给Session["lastTime"];
28
Session["lastTime"] = DateTime.Now.ToString();
29
}
30![](/Images/OutliningIndicators/InBlock.gif)
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![](/Images/OutliningIndicators/InBlock.gif)
39
int i = (int)objDB.sp_Execute("pro_InsertStuAnswer", DataAccess.dbControl.sp_ReturnType.AffectedRowsCount, spTemp);
40![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](/Images/OutliningIndicators/InBlock.gif)
4
![](/Images/OutliningIndicators/InBlock.gif)
5
![](/Images/OutliningIndicators/InBlock.gif)
6
![](/Images/OutliningIndicators/InBlock.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/InBlock.gif)
9
![](/Images/OutliningIndicators/InBlock.gif)
10
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/InBlock.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/InBlock.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/InBlock.gif)
27
![](/Images/OutliningIndicators/InBlock.gif)
28
![](/Images/OutliningIndicators/InBlock.gif)
29
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
30
![](/Images/OutliningIndicators/InBlock.gif)
31
![](/Images/OutliningIndicators/InBlock.gif)
32
![](/Images/OutliningIndicators/InBlock.gif)
33
![](/Images/OutliningIndicators/InBlock.gif)
34
![](/Images/OutliningIndicators/InBlock.gif)
35
![](/Images/OutliningIndicators/InBlock.gif)
36
![](/Images/OutliningIndicators/InBlock.gif)
37
![](/Images/OutliningIndicators/InBlock.gif)
38
![](/Images/OutliningIndicators/InBlock.gif)
39
![](/Images/OutliningIndicators/InBlock.gif)
40
![](/Images/OutliningIndicators/InBlock.gif)
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![](/Images/OutliningIndicators/None.gif)
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![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
2
![](/Images/OutliningIndicators/InBlock.gif)
3
![](/Images/OutliningIndicators/InBlock.gif)
4
![](/Images/OutliningIndicators/InBlock.gif)
5
![](/Images/OutliningIndicators/InBlock.gif)
6
![](/Images/OutliningIndicators/InBlock.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/InBlock.gif)
9
![](/Images/OutliningIndicators/InBlock.gif)
10
![](/Images/OutliningIndicators/InBlock.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/InBlock.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
15
![](/Images/OutliningIndicators/None.gif)
16
![](/Images/OutliningIndicators/None.gif)
17
![](/Images/OutliningIndicators/None.gif)
18
![](/Images/OutliningIndicators/None.gif)
19
![](/Images/OutliningIndicators/None.gif)
20
![](/Images/OutliningIndicators/None.gif)
21
![](/Images/OutliningIndicators/None.gif)
22
![](/Images/OutliningIndicators/None.gif)
23
![](/Images/OutliningIndicators/None.gif)
24
![](/Images/OutliningIndicators/None.gif)
25
![](/Images/OutliningIndicators/None.gif)
26
![](/Images/OutliningIndicators/None.gif)
27
![](/Images/OutliningIndicators/None.gif)
28
![](/Images/OutliningIndicators/None.gif)
29
![](/Images/OutliningIndicators/None.gif)
30
![](/Images/OutliningIndicators/None.gif)
31
![](/Images/OutliningIndicators/None.gif)
32
![](/Images/OutliningIndicators/None.gif)
33
![](/Images/OutliningIndicators/None.gif)
34
![](/Images/OutliningIndicators/None.gif)
35
![](/Images/OutliningIndicators/None.gif)
36
![](/Images/OutliningIndicators/None.gif)
37
![](/Images/OutliningIndicators/None.gif)
38
![](/Images/OutliningIndicators/None.gif)
1
protected dbControl objDB = dbControl.GetDBOpterator(System.Configuration.ConfigurationManager.ConnectionStrings["HDHTTestOnline_ConnectionString"].ConnectionString);
![](/Images/OutliningIndicators/None.gif)