我的一个ASP.. NET页面需要很长时间才能加载
本文关键字:长时间 加载 一个 NET ASP 我的 | 更新日期: 2023-09-27 18:11:12
我目前正在做一个活动输入页面,员工可以把他们每天在某个项目中投入的时间量-但是这个页面需要很多时间来加载!
这是需要时间的地方:
public bool ExistUserActivity(int iYear, int iMonth, IEnumerable<string> sDays, int iProjectId, string Login)
{
bool strRet = false;
try
{
foreach (string s in sDays)
{
string[] values = s.Split(' ');
string strQuery = "SELECT ProjectId FROM UserActivity WHERE CalendarDate = '" + (new DateTime(iYear, iMonth, int.Parse(values[1]))).ToString("yyyy/MM/dd") + "'"; //We 2 donne [0] We et [1] 2
strQuery += " AND ProjectId = " + iProjectId + "";
strQuery += " AND Login = '" + Login + "'";
OleDbDataAdapter mDB_DataAdapter = new OleDbDataAdapter(strQuery, m_strConnectionString);
DataSet mDB_DataSet = new DataSet();
mDB_DataSet.CaseSensitive = false;
mDB_DataAdapter.Fill(mDB_DataSet, "UserActivity"); //It seems to take time after this
strRet = (mDB_DataSet.Tables["UserActivity"].Rows.Count > 0);
mDB_DataAdapter = null;
}
}
catch (Exception ex)
{
}
return strRet;
}
有没有人知道这个问题可能来自哪里以及如何解决它?
低性能可能有多种原因。以下是一些(最明显的):
-
确保表
UserActivity
具有包含CalendarDate
,ProjectId
,Login
列的索引。 如果缺少这样的索引,并且数据量相当大,sql server可能需要花费很长时间来选择数据。 如果您真的只是检查是否有任何记录符合您的标准-没有必要查询从服务器到客户端的所有数据。将查询更改为
SELECT count(ProjectId) FROM UserActivity WHERE CalendarDate...
并在服务器上计算此行数就足够了,而无需将所有数据获取到客户端。
首先尝试循环和分割sDays,但只加载到列表值[1]中。构建所有的日期,然后为这些日期执行SQL。也可以在SPROC中执行SQL。
花费时间的原因是因为您使用foreach循环多次访问数据库以获取数据。这样做:一次获取所有数据:查询数据库以获取projectId、CalendarDate并将它们存储在集合对象中。现在使用foreach循环查询集合对象并查找日期值。
。
public bool IsExists(int iYear,int iMonth)
{
bool check = false;
string allDays = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 24";
try
{
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["aConn"].ToString());
if (conn.State != ConnectionState.Open)
conn.Open();
SqlCommand cmd = new SqlCommand("select ProjectId,CalendarDate from UserActivity where YEAR(CalendarDate) = " + iYear + " and MONTH(CalendarDate) = " + iMonth + "");
cmd.Connection = conn;
SqlDataReader reader = cmd.ExecuteReader();
List<KeyValuePair<string, string>> allValue = new List<KeyValuePair<string, string>>();
if (reader != null)
{
while (reader.Read())
{
allValue.Add(new KeyValuePair<string, string>(reader[0].ToString(), reader[1].ToString()));
}
}
string[] strSplit = allDays.Split(new char[] {' '});
foreach (var s in strSplit)
{
string _currentDate = Convert.ToDateTime(string.Format("{0}/{1}/{2}", s, iMonth, iYear)).ToShortDateString();
foreach (KeyValuePair<string, string> kv in allValue)
{
if (_currentDate == Convert.ToDateTime(kv.Value).ToShortDateString())
{
check = true;
break;
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return check;
}