ASP.NET优化代码时产生的心得体会《一》
现在代码现状:
1、用的是VS自带的控件,速度极度的慢;
2、访问数据库,用的是VS自己建立的ADO.NET实体数据模型(查询数据时,冗余的字段太多),建立方式如下图所示:
3、多次访问数据库,如审核功能--全选页面的50条数据时,后台访问数据库不低于100次,吓死宝宝了······
修改后代码状况:
1、单独修改访问数据库的方式,增加SQLHelper帮助类;
2、大大缩减访问数据库的次数(大概为三次);
3、细节上做了优化,如字符串处理、sql语句拼接、Linq、Lambda等等,详细查看正文。
代码展示区域<一>:后台代码
#region 审核方法(修改) jdc 2016-4-18 public string CheckData(List<string> _list, List<string> _arrselect) { string HasReport = 通过枚举获得; string JDHasReport = 通过枚举获得; string returntxt = string.Empty; //弹出说明 //_list转化为数组(ID) string[] str = _list.ToArray(); //获得审核通过状态 string rep = 通过前台获得; string status = 通过前台获得+相关方法获得; int qyshs = 0; int dwzjshs = 0; int ssshs = 0; int gdzcshs = 0; //初始化拼接的字符串 string qyid = string.Empty; string qtid = string.Empty; //初始化前台传入的主表ID string item1 = string.Empty; string item2 = string.Empty; //初始化--副表Model--的CID(操作表--副表Model--时,更新主表--主表Model--的值) string CID1 = string.Empty; string CID2 = string.Empty; string CID3 = string.Empty; using (TestDataEntities db = new TestDataEntities()) { //根据item即CID获得ComScheduleList List<--副表Model--> List2 = new List<--副表Model-->(db.--副表Model--.OrderByDescending(p => p.ReportTime).Where(s => str.Contains(s.CID))); //根据item即ID获得List1 List<--主表Model--> List1 = new List<--主表Model-->(db.--主表Model--.OrderByDescending(p => p.ReportTime).Where(s => str.Contains(s.ID))); //表--副表Model-- list List<--副表Model--> dataForList; //表--主表Model-- list List<--主表Model--> comList; foreach (var selectid in _arrselect) { foreach (var item in _list) { if (selectid == "0") //企业 { comList = new List<--主表Model-->(); if (rep == 通过枚举获得 //二级 { comList = (from p in List1 where p.ID == item && p.Status == JDHasReport select p).ToList(); } else if 通过枚举获得 //一级 { comList = (from p in List1 where p.ID == item && p.Status == HasReport select p).ToList(); } if (comList.Count > 0) { qyshs += 1; item1 += item + "','";//表ID字符串拼接 } } else { dataForList = new List<--副表Model-->(); if (rep == 通过枚举获得 //二级 { dataForList = (from c in List2 where c.CID == item && c.CType == selectid && c.Status == JDHasReport select c).ToList(); } else if 通过枚举获得 //一级 { dataForList = (from c in List2 where c.CID == item && c.CType == selectid && c.Status == HasReport select c).ToList(); } if (dataForList.Count > 0) { if (dataForList[0].CType == "1") { dwzjshs += 1; CID1 += dataForList[0].CID + "','";//表--副表Model--的CID,即表--主表Model--的ID } else if (dataForList[0].CType == "2") { ssshs += 1; CID2 += dataForList[0].CID + "','"; } else if (dataForList[0].CType == "3") { gdzcshs += 1; CID3 += dataForList[0].CID + "',"; } item2 += dataForList[0].ID + "','"; ;//表(--主表Model--)ID字符串拼接 } } } } //审核更新数据 UpdateChecks(item1, item2, status); //通过表--副表Model--更新主表信息 UpdateIndexTable(CID1, CID2, CID3, status); returntxt = "已审核“博客园信息1" + qyshs + "条,博客园信息2" + dwzjshs + "条,博客园信息3" + ssshs + "条,博客园信息4" + gdzcshs + "条”!"; } return returntxt; } /// <summary> /// 更新主表、副表的审核信息 /// </summary> /// <param name="item1">主表ID</param> /// <param name="item2">副表ID</param> /// <param name="status">审核状态</param> /// <returns></returns> public bool UpdateChecks(string item1, string item2, string status) { //update方法 DateTime AuditTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")); string AuditUnitID = 审核人员部门Id; string AuditUserName = 审核人员; StringBuilder strSql = new StringBuilder(); //判断是否更新数据库 if (item1 != null && item1 != "") { //拼接访问数据库--主表Model--的SQL语句 strSql.Append("update --主表Model-- set "); strSql.Append("auditTime='" + AuditTime + "',"); strSql.Append("auditUnitID='" + AuditUnitID + "',"); strSql.Append("auditUserName='" + AuditUserName + "',"); strSql.Append("Status='" + status + "' "); strSql.Append(" where ID in ('" + item1.Remove(item1.Length - 2, 2) + ");"); } else { strSql.Append(" "); } if (item2 != null && item2 != "") { //拼接访问数据库--副表Model--的SQL语句 strSql.Append(" update --副表Model-- set "); strSql.Append("AuditTime='" + AuditTime + "',"); strSql.Append("AuditUnitID='" + AuditUnitID + "',"); strSql.Append("AuditUserName='" + AuditUserName + "',"); strSql.Append("Status='" + status + "' "); strSql.Append(" where ID in ('" + item2.Remove(item2.Length - 2, 2) + ");"); } else { strSql.Append(" "); } if (strSql.ToString().Trim() != null && strSql.ToString().Trim() != "") { int n = SqlHelper.ExecuteSql(strSql.ToString()); if (n > 0) { return true; } else { return false; } } else { return true; } } /// <summary> /// 通过表--副表Model--更新主表信息 /// </summary> /// <param name="CID1"></param> /// <param name="CID2"></param> /// <param name="CID3">CID代表不同CType下的CID</param> /// <param name="status">审核状态</param> /// <returns></returns> public bool UpdateIndexTable(string CID1, string CID2, string CID3, string status) { StringBuilder strSql = new StringBuilder(); //访问数据库前拼接--主表Model-- //第一种,CType=1(博客园信息2) if (CID1 != null && CID1 != "") { strSql.Append("update --主表Model-- set "); strSql.Append("WDStatus='" + status + "'"); strSql.Append(" where ID in ('" + CID1.Remove(CID1.Length - 2, 2) + ");"); } else { strSql.Append(" "); } //第二种,CType=2(博客园信息3) if (CID2 != null && CID2 != "") { strSql.Append(" update --主表Model-- set "); strSql.Append("SSStatus='" + status + "'"); strSql.Append(" where ID in ('" + CID2.Remove(CID2.Length - 2, 2) + ");"); } else { strSql.Append(" "); } //第三种,CType=3(博客园信息4) if (CID3 != null && CID3 != "") { strSql.Append(" update --主表Model-- set "); strSql.Append("GDZCStatus='" + status + "'"); strSql.Append(" where ID in ('" + CID3.Remove(CID3.Length - 2, 2) + ");"); } else { strSql.Append(" "); } if (strSql.ToString().Trim() != null && strSql.ToString().Trim() != "") { //访问数据库--主表Model-- int n = SqlHelper.ExecuteSql(sql); if (n > 0) { return true; } else { return false; } } else { return true; } } #endregion
代码展示区域<二>:数据库访问代码
/// <summary> /// 执行SQL语句,返回影响的记录数 /// </summary> /// <param name="SQLString">SQL语句</param> /// <returns>影响的记录数</returns> public static int ExecuteSql(string SQLString) { using (SqlConnection connection = new SqlConnection(connStr)) { using (SqlCommand cmd = new SqlCommand(SQLString, connection)) { try { connection.Open(); int rows = cmd.ExecuteNonQuery(); return rows; } catch (System.Data.SqlClient.SqlException e) { connection.Close(); throw e; } } } } #endregion
优化总结:
<一>、使用 StringBuilder 做字符串连接 、string.Empty
<二>、Linq、Lambda的灵活使用,极大的降低了访问数据库的次数
<三>、Append拼接的Sql语句,灵活的访问了数据库。
优化总结中提到的相关技术暂不提供详细技术知识解释,请广大园友通过其它的途径自行解决,也可参照我的代码实例研究。。。。