将此文章发布到首页是想让大家帮助我找到问题所在,所以恳请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![]()
using System;2
using System.Data;3
using System.Data.SqlClient;4
using System.Text;5

6
namespace DataAccess7
{8
public class dbControl9
{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);
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>
<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();
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秒之后显示"正在保存
"的timeout9
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![]()
try2
{3
string RecruId = context.Session["RecruId"].ToString();//招聘ID4
string TestID = context.Session["TestID"].ToString();//测试ID5
string PaperID = context.Session["PaperID"].ToString();//试卷ID6
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![]()
/*2
存储过程名:pro_InsertStuAnswer3
输入参数:4
@RecruID 招聘ID5
@TestID 考试ID6
@PaperID 试卷ID7
@StuID 考生ID8
@QuestionID 问题ID9
@AnswerInfo 问题答案10
输出参数:11
@@ROWCOUNT 操作影响的行数12
用途:13
对某生的某次考试的成绩的添加和修改14
*/15

16
CREATE PROCEDURE dbo.pro_InsertStuAnswer17
@RecruID int,18
@TestID int,19
@PaperID int,20
@StuID int,21
@QuestionID bigint,22
@AnswerInfo varchar(50)23
24
AS25
if (select count(*) from tb_StuAnswers where RecruID=@RecruID and TestID=@TestID and PaperID=@PaperID and StuID=@StuID and QuestionID=@QuestionID)=026
begin27
--没有记录,则向表中插入该条记录28
insert into Tb_StuAnswers(RecruID,TestID,PaperID,StuID,QuestionID,AnswerInfo) values(@RecruID,@TestID,@PaperID,@StuID,@QuestionID,@AnswerInfo);29
end30
else31
begin32
--数据库已有该记录,则说明考生为修改答案33
update Tb_StuAnswers set AnswerInfo=@AnswerInfo where RecruID=@RecruID and TestID=@TestID and PaperID=@PaperID and StuID=@StuID and QuestionID=@QuestionID 34
end35
return @@ROWCOUNT;36
RETURN37
GO38

1
protected dbControl objDB = dbControl.GetDBOpterator(System.Configuration.ConfigurationManager.ConnectionStrings["HDHTTestOnline_ConnectionString"].ConnectionString);
protected dbControl objDB = dbControl.GetDBOpterator(System.Configuration.ConfigurationManager.ConnectionStrings["HDHTTestOnline_ConnectionString"].ConnectionString);
点个广告:

浙公网安备 33010602011771号