我目前正在制作一个“活动输入”页面,员工可以将每天投放的时间放在某个项目中 - 但此页面需要花费大量时间才能加载!
这里需要时间:
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 :(得分:3)
性能低下可能有多种原因。以下是一些(最明显的):
确保您的表格UserActivity
包含包含CalendarDate
,ProjectId
,Login
列的索引。如果缺少这样的索引并且数据量相当大 - sql server可能需要花费大量时间来选择数据。
如果您真的只是检查是否有任何记录符合您的标准 - 则无需查询从服务器到客户端的所有数据。将查询更改为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;
}