Заполнение данных Mysql в календарь asp занимает слишком много времени для загрузки - PullRequest
0 голосов
/ 08 апреля 2019

Я создаю календарь отпусков для сотрудников, и для этого я заполняю некоторые данные в календаре с помощью 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>"));
            }
        }
    }

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

1 Ответ

2 голосов
/ 08 апреля 2019

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

...