簡體   English   中英

將Mysql數據填充到asp日歷需要太長時間才能加載

[英]Populating Mysql Data to asp calendar takes too long to load

我正在為員工創建一個假期日歷,為此,我使用dataset將一些數據填充到日歷上,但是加載數據花費的時間太長。

我正在使用多個MySqlDataReaderconnections來從MySql表中讀取日歷表的每一行的數據。 也許使用多個連接和閱讀器可能是導致速度變慢的原因,但我不確定。 以下是我用來填充數據的代碼。

class Sample
    {
        public DateTime Date { get; set; }
        public string SlotAvailable { get; set; }
        public string Pending { get; set; }
        public string HeadCount { get; set; }
    }
    DateTime firstDate { get; set; }
    DateTime lastDate { get; set; }
    List<Sample> samples = new List<Sample>();
    protected DataSet dsleaveplanner;
    protected void FillLeaveplannerDataset()
    {
        cal2.VisibleDate = cal2.TodaysDate;
        DateTime firstDate = new DateTime(cal2.VisibleDate.Year, cal2.VisibleDate.Month, 1).AddDays(-6);
        DateTime lastDate = new DateTime(cal2.VisibleDate.Date.AddMonths(1).Year, cal2.VisibleDate.Date.AddMonths(1).Month, 1).AddDays(7);
        dsleaveplanner = GetCurrentMonthData(firstDate, lastDate);
    }
    protected DateTime GetFirstDayOfNextMonth()
    {
        int monthNumber, yearNumber;
        if (cal2.VisibleDate.Month == 12)
        {
            monthNumber = 1;
            yearNumber = cal2.VisibleDate.Year + 1;
        }
        else
        {
            monthNumber = cal2.VisibleDate.Month + 1;
            yearNumber = cal2.VisibleDate.Year;
        }
        DateTime lastDate = new DateTime(yearNumber, monthNumber, 1);
        return lastDate;
    }
    protected DataSet GetCurrentMonthData(DateTime firstDate, DateTime lastDate)
    {
        string site = lblsite.Text;
        string skill = lblskill.Text;
        string shift = lblshift.Text;
        DataSet dsMonth = new DataSet();
        string MyConString = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
        MySqlConnection con = new MySqlConnection(MyConString);
        string caldate = "Select * From setshrinkage Where date >= @firstDate And date <= @lastDate And site=@site And skill=@skill And shift=@shift Group By date";
        MySqlCommand cmd = new MySqlCommand(caldate, con);
        cmd.Parameters.AddWithValue("@firstDate", firstDate);
        cmd.Parameters.AddWithValue("@lastDate", lastDate);
        cmd.Parameters.AddWithValue("@site", site);
        cmd.Parameters.AddWithValue("@skill", skill);
        cmd.Parameters.AddWithValue("@shift", shift);
        MySqlDataAdapter mysqlDataAdapter = new MySqlDataAdapter(cmd);
        try
        {
            mysqlDataAdapter.Fill(dsMonth);
            con.Close();
        }

        catch { }
        return dsMonth;

    }
    public void caldisp(DayRenderEventArgs e)
    {
        Environment.NewLine.ToString();
        e.Cell.ForeColor = System.Drawing.Color.Red;
        e.Cell.Font.Size = 9;
        e.Cell.Controls.Add(new LiteralControl("<p></p>Slot available:"));
        e.Cell.Controls.Add(new LiteralControl(samples.Where(x => x.Date == e.Day.Date).FirstOrDefault().SlotAvailable.ToString()));
        e.Cell.Controls.Add(new LiteralControl("<p></p>Pending:"));
        e.Cell.Controls.Add(new LiteralControl(samples.Where(x => x.Date == e.Day.Date).FirstOrDefault().Pending.ToString()));
    }


    protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
    {
        DateTime nextDate;
        //e.Day.IsSelectable = false;
        if (dsleaveplanner != null)
        {
            foreach (DataRow dr in dsleaveplanner.Tables[0].Rows)
            {
                nextDate = (DateTime)dr["date"];
                var hcount = (dr["headCount"].ToString());
                Int32 hcount1 = Convert.ToInt32(hcount);
                string MyConString = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
                MySqlConnection conn = new MySqlConnection(MyConString);
                string cntdate = "SELECT COUNT(date) FROM approved WHERE date = @date And site=@site And skill=@skill And shift=@shift And status=@status";
                string cntdate2 = "SELECT COUNT(date) FROM approved WHERE date = @date And site=@site And skill=@skill And shift=@shift And status=@status";
                MySqlCommand cmd2 = new MySqlCommand(cntdate, conn);
                MySqlCommand cmd3 = new MySqlCommand(cntdate2, conn);
                cmd2.Parameters.AddWithValue("@date", nextDate);
                cmd2.Parameters.AddWithValue("@site", lblsite.Text);
                cmd2.Parameters.AddWithValue("@skill", lblskill.Text);
                cmd2.Parameters.AddWithValue("@shift", lblshift.Text);
                cmd2.Parameters.AddWithValue("@status", "auto-approved");
                cmd3.Parameters.AddWithValue("@date", nextDate);
                cmd3.Parameters.AddWithValue("@site", lblsite.Text);
                cmd3.Parameters.AddWithValue("@skill", lblskill.Text);
                cmd3.Parameters.AddWithValue("@shift", lblshift.Text);
                cmd3.Parameters.AddWithValue("@status", "pending");
                string chklog = "SELECT date FROM approved WHERE date = @date And agentlogin=@login And status=@stat";
                MySqlCommand cmd1 = new MySqlCommand(chklog, conn);
                cmd1.Parameters.AddWithValue("@date", nextDate);
                cmd1.Parameters.AddWithValue("@login", Label1.Text);
                cmd1.Parameters.AddWithValue("@stat", "auto-approved");
                conn.Open();
                string count = cmd2.ExecuteScalar().ToString();
                string count2 = cmd3.ExecuteScalar().ToString();
                var slot2 = Convert.ToInt32(count);
                Int32 slot3 = hcount1 - slot2;
                string slot4 = slot3.ToString();
                MySqlDataReader dr1 = cmd1.ExecuteReader();
                MySqlConnection con = new MySqlConnection(MyConString);
                string chklog1 = "SELECT date FROM approved WHERE date = @date And agentlogin=@login And status=@stat";
                MySqlCommand cmd4 = new MySqlCommand(chklog1, con);
                cmd4.Parameters.AddWithValue("@date", nextDate);
                cmd4.Parameters.AddWithValue("@login", Label1.Text);
                cmd4.Parameters.AddWithValue("@stat", "pending");
                con.Open();
                MySqlDataReader dr2 = cmd4.ExecuteReader();
                MySqlConnection con2 = new MySqlConnection(MyConString);
                string chklog2 = "SELECT date FROM approved WHERE date = @date And agentlogin=@login And status=@stat";
                MySqlCommand cmd5 = new MySqlCommand(chklog2, con2);
                cmd5.Parameters.AddWithValue("@date", nextDate);
                cmd5.Parameters.AddWithValue("@login", Label1.Text);
                cmd5.Parameters.AddWithValue("@stat", "rejected");
                con2.Open();
                MySqlDataReader dr3 = cmd5.ExecuteReader();
                MySqlConnection con3 = new MySqlConnection(MyConString);
                string chklog3 = "SELECT date FROM approved WHERE date = @date And agentlogin=@login And status=@stat";
                MySqlCommand cmd6 = new MySqlCommand(chklog3, con3);
                cmd6.Parameters.AddWithValue("@date", nextDate);
                cmd6.Parameters.AddWithValue("@login", Label1.Text);
                cmd6.Parameters.AddWithValue("@stat", "agent-withdrawn");
                con3.Open();
                MySqlDataReader dr4= cmd6.ExecuteReader();
                if (nextDate == e.Day.Date)
                {
                    if (dr1.HasRows)
                    {
                        e.Cell.BackColor = System.Drawing.Color.LightGreen;
                    }
                    else if (dr2.HasRows)
                    {
                        e.Cell.BackColor = System.Drawing.Color.Gold;
                    }
                    else if (dr3.HasRows)
                    {
                        e.Cell.BackColor = System.Drawing.Color.Tomato;
                    }
                    else if (dr4.HasRows)
                    {
                        e.Cell.BackColor = System.Drawing.Color.DarkTurquoise;
                    }
                }
                conn.Close();
                con.Close();
                con2.Close();
                con3.Close();
                samples.Add(new Sample { Date = nextDate, SlotAvailable = slot4, Pending = count2 });
            }
            if (samples.Any(x => x.Date == e.Day.Date))
            {
                string weekoff = lblweekoff.Text;
                List<string> offday = (lblweekoff.Text).Split(',').ToList();
                if (offday.Contains(e.Day.Date.ToString("ddd")))
                {
                    e.Cell.Font.Size = 9;
                    e.Cell.Controls.Add(new LiteralControl("<p>Week-Off </p>"));
                }
                else
                {
                    caldisp(e);
                }
            }
            else
            {
                e.Cell.ForeColor = System.Drawing.Color.Red;
                e.Cell.Font.Size = 9;
                e.Cell.Controls.Add(new LiteralControl("<p>Target not set! </p>"));
            }
        }
    }

我如何使這個過程更快? 任何幫助表示贊賞,在此先感謝!

您在foreach語句中有6個SQL查詢,如果dsleaveplanner中有10行,則程序將執行60個SQL查詢。 此數量的SQL查詢將對性能產生負面影響。
嘗試在foreach語句之前檢索所有數據,並將數據存儲到列表(內存)中,然后在foreach中使用它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM