您的位置:首页 > 编程语言 > ASP

ASP.NET优化代码时产生的心得体会《一》

2016-04-20 15:29 656 查看
[b]现在代码现状:[/b]

1、用的是VS自带的控件,速度极度的慢;

2、访问数据库,用的是VS自己建立的ADO.NET实体数据模型(查询数据时,冗余的字段太多),建立方式如下图所示:



3、多次访问数据库,如审核功能--全选页面的50条数据时,后台访问数据库不低于100次,吓死宝宝了······

[b]修改后代码状况:[/b]

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

<二>、[b]Linq、Lambda的灵活使用,极大的降低了访问数据库的次数[/b]

[b]<三>、Append拼接的Sql语句,灵活的访问了数据库。[/b]

[b]优化总结中提到的相关技术暂不提供详细技术知识解释,请广大园友通过其它的途径自行解决,也可参照我的代码实例研究。。。。[/b]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: