【NCRE】---拼接SQL语句(Case....When语句)

        开发到了这个紧要关头,功能基本都已经完成,剩下来的就是需要解决软件的性能问题!
    我们一开始设计的时候是:每一个得分点都判断一次,并将考生答案和考生得到的分数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 '女' 


case的搜索语句:
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END

用CASE WHEN语句可以简化我们平时工作中遇到的很多问题。如性别在表中存的是数字1、2,但是希望查询出来男、女时,就可以用case...when语句。当然它也不仅仅限于查询语句,更新语句也是可以的。比如我上面贴出的例子!


小总:
在写这个拼接语句的时候还遇到了一个好笑的事情:我当时只是顾着写这个拼接sql语句了,经过师哥的指导写出来很高兴,可是只是顾着高兴了,结果忘了用sqlhelper来进行数据库的开关操作了!!!真是对自己无语了!不过,自己学到了新的知识还是挺高兴的!




  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 39
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值