批量添加-动态拼接字符串

字符串拼接主要包括以下三类,第三种方法是今天的重点。

  • +
  • Sring.format()
  • StringBuilder.Append()


一、+
      对于少量固定的字符串拼接,我们可以简单利用“+”:
string s= “a” + “b” + “c”;
这样写,系统或优化成如下代码,不会新建多个字符串。
s= String.Concat(“a”,”b”,”c”)

如果写成如下代码, 系统则会创建三个新的字符串
string str="a";
str+="b";
str+="c";
实现原理是:第一步现在内存中分配空间,存储str变量的对象,值为“a“;第二句代码“+=”时,就会创建一个对象来存储新的字符串(“ab”),把str指向这个新的地址;第三句代码
“+=”时,就又会创建一个对象来存储新的字符串(“abc”),再次把str指向新的地址。所以只有简单几步的拼写时,一般不会有太大问题,如果有时候需要循环拼接时,就会不断创
建新的对象,很浪费空间和性能。

二、 Sring.format()
public static String Format(IFormatProvider provider, String format, params Object[] args) <br>{
    if (format == null || args == null)
      throw new ArgumentNullException((format==null)?"format":"args");
    StringBuilder sb = new StringBuilder(format.Length + args.Length * 8);
    sb.AppendFormat(provider,format,args);
    return sb.ToString();
}
可以看到是先创建一个StringBuilder类型的变量,长度为第一个参数的长度+参数长度的8背。.net自动分配一个比较大的容量来存储。这种方法的代码看起来比较整洁,易于阅
读,效率也比“+”高效很多。

三、 StringBuilder.Append()
StringBuilder str=new StringBuilder();
str.Append("a");
StringBuilder是预先创建一个比较的内存,以后每次操作是判断容量上线是否不够用,如果不够用就自动把容量扩大一倍,修改的还是第一次创建的对象的值。
具体实现流程为:首先将需要的数据存储到实体的list中,然后将这个list传给我们批量添加的方法;批量添加的方法首先应该打开数据库连接,然后开始进行sql字符串的拼接,
拼接完成后,调用sqlhelper方法进行添加。
具体代码如下:
        /// <summary>
        /// 判分之后返回信息到数据库
        /// </summary>
        /// <param name="excelrecord">根据StudentID判断</param>
        /// <returns>是否添加成功</returns>
        public void ReturnExcelScore(List<ExcelQuestionRecordEntity> list, ExcelQuestionRecordEntity excelrecord)
        {           
            String which = WhichExcelRecored (excelrecord);
            StringBuilder sbSql = new StringBuilder();
            sbSql.Append("update ExcelQuestionRecordEntity_" + 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 .ToString();
                //判分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();
                if (examAnswer.IndexOf("'") > 0)
                {
                    examAnswer = "考生答案错误";
                }
                questionID = list[i].QuestionID.ToString();
                //学生答案信息更新,when后边的是QuerstionID,
                sbSql.Append(" WHEN '" + questionID + "' THEN '" + 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);
        }


评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木子松的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值