Реализовать поиск по дате c# Windows Forms (NET. Framework) + MSSQL

возникла необходимость написать код, который будет выполнятся по нажатию на кнопку в форме по поиску записей из таблицы Table_Vilety, где главным параметром по поиску будет столбец Time_vilet (дата вылета для рейса (datetime)) из БД Airport на С# в Windows Forms NET. Framework с подключенной БД из MSSQL Server.

Фото формы: введите сюда описание изображения

Код, написанный при помощи гайдов в интернете не дал результата:

SqlConnection con = new SqlConnection(@"Data Source=DESKTOP-3SB9FF6\SQLEXPRESS;Initial Catalog=Airport;Integrated Security=True");

private void button1_Click(object sender, EventArgs e)
        {
            con.Open();
            SqlCommand cmd = con.CreateCommand();
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = "select * from Table_Vilety where Time_vilet = '" + dateTimePicker1.Text + "'";
            cmd.ExecuteNonQuery();
            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            da.Fill(dt);
            dataGridView1.DataSource = dt;
            con.Close();
        }

dateTimePicker1 имеет формат "yyyy-MM-dd" С таким же кодом работает поиск по ID или рейсу, но с типом данных как datetime вообще не получается. Буду рад, если подробно опишите, как в этом случае написать код.

P.S.: DataGridView1 берет сам данные из таблицы (в коде нету внесения данных для каждого отдельного столбца. Работает и так, да и я не вижу смысла для огромной БД для каждой формы расписывать большой код).


Ответы (2 шт):

Автор решения: SmithZz

Я прочёл все об этой теме тут: https://stackoverflow.com/questions/17418258/datetime-format-to-sql-format-using-c-sharp

Спасибо Frehzy!

Ответ для себя я нашел достаточно простой. Нужно лишь дописать DateTime.Parse() чтобы преобразовать указанное строковое представление даты и времени в эквивалент DateTime, используя указанный формат и информацию о формате для конкретной культуры. Формат строкового представления должен точно соответствовать указанному формату "yyyy-MM-dd"

Полный запрос будет выглядеть следующим образом (надеюсь, что я смог помочь и другим, кто столкнется с этим вопросом):

cmd.CommandText = "select * from Table_Vilety where Time_vilet = '" + DateTime.Parse(dateTimePicker1.Text) + "'";

Подробнее о самом преобразовании строки в другой формат тут: https://docs.microsoft.com/en-us/dotnet/api/system.datetime.parse?view=net-6.0

Прилагаю ссылку от Frehzy на полезный источник про парсинг в C# тут: https://stackoverflow.com/questions/5366285/parse-string-to-datetime-in-c-sharp

→ Ссылка
Автор решения: Alexander Petrov

Предлагаю максимально упростить код следующим образом:

Строка соединения хранится в поле класса. По идее, она должна считываться из конфига.

private string _connectionString = @"Data Source=DESKTOP-3SB9FF6\SQLEXPRESS;Initial Catalog=Airport;Integrated Security=True";

SqlDataAdapter может сам создать соединение, открыть и закрыть его, создать SqlCommand.

string sql = "select * from Table_Vilety where Time_vilet = @dt";

using var da = new SqlDataAdapter(sql, _connectionString);
da.SelectCommand.Parameters.Add("dt", SqlDbType.DateTime2).Value = dateTimePicker1.Value;


DataTable dt = new DataTable();
da.Fill(dt);

dataGridView1.DataSource = dt;

Обязательно используйте параметризованные sql-запросы! Это и от ошибок защитит, и производительность повысит.

Укажите правильный тип SqlDbType - я не знаю, какой именно тип у вас в БД. Надеюсь, там не (n)varchar...

→ Ссылка