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语句,灵活的访问了数据库。

 

优化总结中提到的相关技术暂不提供详细技术知识解释,请广大园友通过其它的途径自行解决,也可参照我的代码实例研究。。。。

 

posted @ 2016-04-20 15:29  ℃7O八落~的点滴  阅读(373)  评论(0编辑  收藏  举报