Member 13151446 Ответов: 2

Как автоматически обновить оставшиеся дни из базы данных в datagridview в соответствии с текущей датой?


Я создаю приложение для windows с использованием C# .Net, у меня есть DataGridView, DateTimePicker и текстовое поле с именем "days left" и кнопка сохранения в этом окне. У меня есть база данных таблица называется "транспортного средства" и включает в себя две колонки назван "срок годности" и "DaysLeft", я хочу, чтобы хранить данные от Windows форма к таблице базы данных, и она должна хранить DaysLeft либо -ве или положительные значения в соответствии с текущей датой и я также хочу, чтобы обновить столбец DaysLeft автоматически в практическое руководство по текущую дату.

Что я уже пробовал:

Я попробовал следующий код

private void dateTimePickerKhaas_ValueChanged(object sender, EventArgs e)
        {
            DateTime from = dateTimePickerKhaas.Value;
            DateTime to = DateTime.Now;
            TimeSpan Tspan = from - to;
            double days = Tspan.TotalDays;
            txtKDaysLeft.Text = days.ToString("0");
        }


private void btnKSave_Click(object sender, EventArgs e)
        {
                con.Open();
                String query = "INSERT INTO table_khaas ( ExpiryDate, DaysLeft) VALUES( '" + dateTimePickerKhaas.Value.ToString("MM/dd/yyyy") + "'  ,'" +txtKDaysLeft.Text + "')";
                SqlDataAdapter sda = new SqlDataAdapter(query, con);
                DataTable dt = new DataTable();
                sda.Fill(dt);
                dataGridViewKhaas.DataSource = dt;
                
                con.Close();
                grd_fillKhaas();


                MessageBox.Show("Inserted Successfully");
                dateTimePickerKhaas.Value = DateTime.Now;
                txtKDaysLeft.Text = "";
                        
        }

public void grd_fillKhaas()
        {
            //con.Open();
            String query = "SELECT * FROM table_khaas";
            SqlDataAdapter sda = new SqlDataAdapter(query, con);
            DataTable dt = new DataTable();
            sda.Fill(dt);
            dataGridViewKhaas.DataSource = dt;
            //con.Close();
        }

2 Ответов

Рейтинг:
12

Patrice T

Цитата:
У меня есть таблица базы данных с именем "vehicle", и она включает в себя два столбца с именами "expiration date" и " DaysLeft",

Совет: никогда не помещайте изменчивые данные в базу данных, это поток проектирования.
Изменчивые данные-это данные, которые меняются очень часто, как и каждый день. Потому что для того, чтобы использовать этот столбец "DaysLeft", вы всегда должны обновлять его, если только вы не знаете, что обновление уже было сделано. Поверьте, это большая боль в реальной ситуации.

Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и если это откроет дверь уязвимости под названием "SQL-инъекция", то она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа рухнет. Если пользователь вводит имя типа "Брайан О'Коннер", это может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция-Википедия[^]
SQL-инъекция[^]


Рейтинг:
12

Richard Deeming

Снять DaysLeft столбец и вычислить его при запросе таблицы:

public void grd_fillKhaas()
{
    using (var connection = new SqlConnection("..."))
    {
        var sda = new SqlDataAdapter("SELECT ExpiryDate, DateDiff(dd, GetDate(), ExpiryDate) As DaysLeft FROM table_khaas", connection);
        var dt = new DataTable();
        sda.Fill(dt);
        dataGridViewKhaas.DataSource = dt;
    }
}

private void btnKSave_Click(object sender, EventArgs e)
{
    using (var connection = new SqlConnection("..."))
    using (var command = new SqlCommand("INSERT INTO table_khaas ( ExpiryDate ) VALUES ( @ExpiryDate )", connection))
    {
        command.Parameters.AddWithValue("@ExpiryDate", dateTimePickerKhaas.Value);
        
        connection.Open();
        command.ExecuteNonQuery();
    }
    
    grd_fillKhaas();
    

    MessageBox.Show("Inserted Successfully");
    dateTimePickerKhaas.Value = DateTime.Now;
    txtKDaysLeft.Text = "";
}

DATEDIFF (Transact-SQL) | Microsoft Docs[^]