我的一个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;
}

有没有人知道这个问题可能来自哪里以及如何解决它?

我的一个ASP.. NET页面需要很长时间才能加载

低性能可能有多种原因。以下是一些(最明显的):

  1. 确保表UserActivity具有包含CalendarDate, ProjectId, Login列的索引。

  2. 如果缺少这样的索引,并且数据量相当大,sql server可能需要花费很长时间来选择数据。
  3. 如果您真的只是检查是否有任何记录符合您的标准-没有必要查询从服务器到客户端的所有数据。将查询更改为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;
        }