Реализовать поиск по дате 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 шт):
Я прочёл все об этой теме тут: 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
Предлагаю максимально упростить код следующим образом:
Строка соединения хранится в поле класса. По идее, она должна считываться из конфига.
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...
