Загрузка данных Mysql в календарь asp занимает слишком много времени

Я создаю календарь отпусков для сотрудников, и для этого я заполняю некоторые данные в календарь, используя dataset, но загрузка данных занимает слишком много времени.

Я использую несколько MySqlDataReader и connections для чтения данных из таблицы 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>"));
            }
        }
    }

Как я могу ускорить этот процесс? Любая помощь приветствуется, Заранее спасибо!


person prkash    schedule 08.04.2019    source источник
comment
Вместо отдельных запросов для каждой даты вы, конечно, могли бы просто получить все данные в диапазоне дат (например, диапазон дат, которые будут отображаться в календаре)   -  person ADyson    schedule 08.04.2019
comment
Вы также, похоже, запускаете один и тот же запрос несколько раз, меняя только параметр stat. Это очень неэффективно. Вместо этого вы можете использовать предложение SQL IN, чтобы позволить вам выбирать строки, которые содержат любое из набора значений. Я думаю, что потенциальная проблема, с которой вы столкнулись, заключается в том, что вам нужно еще немного изучить SQL.   -  person ADyson    schedule 08.04.2019


Ответы (1)


У вас есть 6 SQL-запросов в операторе foreach, если у вас есть 10 строк в dsleaveplanner, программа выполнит 60 SQL-запросов. такое количество SQL-запросов отрицательно скажется на производительности.
попытайтесь получить все данные перед оператором foreach и сохранить данные в списках (памяти), а затем использовать их в своем foreach

person Alaaeddine HFIDHI    schedule 08.04.2019
comment
Проблема с вашим предложением заключается в самой первой строке цикла foreach nextDate = (DateTime)dr["date"];, я должен использовать это значение в качестве параметра для всех запросов. Это значение можно получить только внутри цикла foreach. Если есть способ получить это значение перед циклом, сообщите мне. Спасибо - person prkash; 08.04.2019
comment
Я согласен с вами, но перед foreach вы можете получить все данные в список, а затем отфильтровать список в foreach - person Alaaeddine HFIDHI; 08.04.2019