开发到了这个紧要关头,功能基本都已经完成,剩下来的就是需要解决软件的性能问题!
我们一开始设计的时候是:每一个得分点都判断一次,并将考生答案和考生得到的分数update到数据库中,也就是每判一个得分点就得开关一次数据库。得分点少的像IE,Windows不会造成很大的麻烦,可是想word,PPT,excel这种得分点多的,尤其是我操作的word,一套题的得分点有40多个,就相当于要开合数据库40次才判完分,这样自然就会慢很多!
所以师哥师姐就想出了利用list一次性的update多条数据,只开合一次数据库,性能也会提高很多的!所以就出现了我接下来要说的这个拼接sql语句!
师哥是用的case...when语句来拼接的。所以我就查了一下到底什么是case...when语句。
先来一个对比:
之前的语句:纯粹的sql语句,不难,常用。
/// <summary>
/// 判分之后返回信息到数据库
/// </summary>
/// <param name="studentinfo">根据考生ID判断</param>
/// <returns>是否添加成功</returns>
public int ReturnScore(WordQuestionRecordEntity studentrecord)
{
//StudentInfoEntity student = new StudentInfoEntity();
String which = WhichWordRecored(studentrecord);
string sql = "update WordQuestionRecordEntity_" + which + " set Fration=@Fration,ExamAnswer =@ExamAnswer where QuestionID =@QuestionID and studentID =@studentID";
SqlParameter[] paras = new SqlParameter[]{
new SqlParameter("@studentID",studentrecord.StudentID ),
new SqlParameter ("@Fration",studentrecord.Fration ),
new SqlParameter ("@ExamAnswer",studentrecord.ExamAnswer),
new SqlParameter ("@QuestionID",studentrecord.QuestionID )
};
int flag= sqlhelper.ExecuteNonQuery (sql, paras, CommandType.Text);
return flag;
}
修改之后的语句:要注意细节,比如空格的位置,逗号的位置,是否加逗号等!
#region 将答案和分数更新到数据库中 李少然 2015年12月26日10:09:07
/// <summary>
/// 将答案和分数更新到数据库中
/// </summary>
/// <param name="list">StudentID,QuestionID,ExamAnswer,TimeStamp,fration</param>
/// <param name="studentrecord">只需要一个studentID,为了查出学院ID</param>
public void ReturnScore(List<WordQuestionRecordEntity> list, WordQuestionRecordEntity studentrecord)
{
String which = WhichWordRecored(studentrecord);
StringBuilder sbSql = new StringBuilder();
sbSql.Append("update WordQuestionRecordEntity_" + which + " SET Fration = CASE QuestionID ");
string Fation = string.Empty;
string questionID = string.Empty;
string studentIDs = string.Empty;
string tamstamp = string.Empty;
//根据学号,和时间戳选出这一段的内容,然后再根据QuestionID给每一个flag更新分数。
#region 更新分数的拼接sql语句
for (int i = 0; i < list.Count; i++)
{
questionID = list[i].QuestionID.ToString();
//将分数传给变量
Fation = list[i].Fration;
//判分sql,拼接sql,用case,when语句
sbSql.Append(" WHEN '" + questionID + "' THEN '" + Fation + "'");
}
sbSql.Append("end,"); //加“,”
#endregion
#region 拼接考生答案更新到数据库中
//拼接更新考生答案sql
sbSql.Append(" ExamAnswer = CASE QuestionID");
for (int i = 0; i < list.Count; i++)
{
string examAnswer = list[i].ExamAnswer.ToString();
questionID = list[i].QuestionID.ToString();
//学生答案信息更新,when后边的是QuerstionID,
sbSql.Append(" WHEN '" + questionID + "' THEN '" + list[i].ExamAnswer + "'");
}
sbSql.Append(" end"); //不加逗号“,”
#endregion
studentIDs += "'" + list[0].StudentID.ToString() + "'";
tamstamp += "'" + list[0].TimeStamp.ToString() + "'";
//去除语句最后的逗号或者括号
studentIDs.Remove(studentIDs.Length - 1, 1);
sbSql.Append(" where StudentID in (" + studentIDs + ") and TimeStamp in (" + tamstamp + ")");
DataTable dt = sqlhelper.ExecuteQuery(sbSql.ToString(), CommandType.Text);
}
#endregion
简单的case语句如下:
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
WHEN '1' THEN '男'
WHEN '2' THEN '女'
case的搜索语句:
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END
用CASE WHEN语句可以简化我们平时工作中遇到的很多问题。如性别在表中存的是数字1、2,但是希望查询出来男、女时,就可以用case...when语句。当然它也不仅仅限于查询语句,更新语句也是可以的。比如我上面贴出的例子!
小总:
在写这个拼接语句的时候还遇到了一个好笑的事情:我当时只是顾着写这个拼接sql语句了,经过师哥的指导写出来很高兴,可是只是顾着高兴了,结果忘了用sqlhelper来进行数据库的开关操作了!!!真是对自己无语了!不过,自己学到了新的知识还是挺高兴的!