Загрузка данных 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>"));
            }
        }
    }

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

Вместо отдельных запросов для каждой даты вы, конечно, могли бы просто получить все данные в диапазоне дат (например, диапазон дат, которые будут отображаться в календаре)

ADyson 08.04.2019 17:34

Вы также, похоже, запускаете один и тот же запрос несколько раз, меняя только параметр «stat». Это очень неэффективно. Вместо этого вы можете использовать предложение SQL «IN», чтобы позволить вам выбирать строки, которые содержат любое из набора значений. Я думаю, что потенциальная проблема, с которой вы столкнулись, заключается в том, что вам нужно еще немного изучить SQL.

ADyson 08.04.2019 17:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Проблема с вашим предложением — это самая первая строка в цикле foreach nextDate = (DateTime)dr["date"];, я должен использовать это значение в качестве параметра для всех запросов. Это значение можно получить только внутри цикла foreach. Если есть способ получить это значение перед циклом, сообщите мне. Спасибо

prkash 08.04.2019 12:12

Я согласен с вами, но перед foreach вы можете получить все данные в список, а затем отфильтровать список в foreach

Alaaeddine HFIDHI 08.04.2019 12:16

Другие вопросы по теме