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

时间:2015-09-03 12:09:39

标签: c# sql asp.net .net asp.net-mvc

我目前正在制作一个“活动输入”页面,员工可以将每天投放的时间放在某个项目中 - 但此页面需要花费大量时间才能加载!

这里需要时间:

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;
}

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

3 个答案:

答案 0 :(得分:3)

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

  1. 确保您的表格UserActivity包含包含CalendarDateProjectIdLogin列的索引。如果缺少这样的索引并且数据量相当大 - sql server可能需要花费大量时间来选择数据。

  2. 如果您真的只是检查是否有任何记录符合您的标准 - 则无需查询从服务器到客户端的所有数据。将查询更改为SELECT count(ProjectId) FROM UserActivity WHERE CalendarDate...并在服务器上计算此行数而不将所有数据发送到客户端就足够了。

答案 1 :(得分:0)

首先尝试循环和分割sDays,但只加载到列表值[1]。构建所有日期,然后为这些日期执行SQL。您也可以在SPROC中执行SQL。

答案 2 :(得分:0)

之所以花时间,是因为你经常使用foreach循环来数据库来获取数据。 做这个: 一次性获取所有数据: 查询数据库以获取projectId,CalendarDate并将它们存储在集合对象中。 现在使用foreach循环查询集合对象并查找日期值。

E.g。

 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;
        }