2015-09-03 96 views
0

我目前正在开发一个活动输入页面,员工可以将每天放入某个项目的小时数 - 但这个页面需要很多时间的时间加载!我的一个ASP.NET页面需要很长时间才能加载

这里就是需要时间:

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

有没有人有任何想法,问题可能来自于,如何解决呢?

+0

您正在为可枚举中的每个sDay执行一个SQL查询。如果你在这个枚举中有多个项目,这很容易导致延迟 - 特别是如果SQL服务器位于不同的机器上。 – Coda17

+0

哦,我明白了,这不是我的源代码,所以我想知道(实习的第一年比较学生)。可能没有足够的信息来找到更快的方式来做到这一点,是吗? – Christopher

+1

并修复SQL注入,而你在它 – Fredou

回答

3

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

  1. 确保你的表UserActivity有指数与CalendarDateProjectIdLogin列包括在内。如果缺少这样的索引并且数据量相当大 - sql服务器可能需要很长时间来选择数据。

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

0

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

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; 
     } 
相关问题