Как выделить определенные дни в monthcalendar данными из бд?
Хочу вывести, но в выдает ошибку на строке DateTime myVacation1 = new DateTime(Convert.ToInt32(reader["ДатаВылета"])); Я знаю, что она не верная, скорее всего строка полностью неправильная. Данные в бд access хранятся в ввиде даты/время, в данном случае дата, пример (17.06.2022) Код:
private void Data2_Click(object sender, EventArgs e)
{
monthCalendar2.Visible = true;
OleDbCommand t1 = new OleDbCommand();
t1.Connection = MyConn;
t1.CommandText = ("SELECT ДатаВылета FROM Рейсы WHERE Класс = @CL AND ГородаВылета = @Depcity AND ГородаПрилета = @arrcity AND ДатаВылета = @dat1");
t1.Parameters.AddWithValue("@CL", comboBox4.Text);
t1.Parameters.AddWithValue("@Depcity", comboBox1.Text);
t1.Parameters.AddWithValue("@arrcity", comboBox2.Text);
t1.Parameters.AddWithValue("@dat1", Data1.Text);
OleDbDataAdapter ad = new OleDbDataAdapter();
DataTable tablo = new DataTable();
ad.SelectCommand = t1;
using (OleDbDataReader reader = t1.ExecuteReader())
{
while (reader.Read())
{
DateTime myVacation1 = new DateTime(Convert.ToInt32(reader["ДатаВылета"]));
monthCalendar2.AddBoldedDate(myVacation1);
}
}
}
Ответы (1 шт):
Использовать хранение в базе данных даты-времени в виде строки - это изысканный способ самому себе сделать хуже. Потому что Вы получаете неопределенность в формате, в котором надо вводить дату и время, а также проблемы с сортировкой, сравнением и т.п. штуками, которых мы ожидаем от базы данных.
Поясню подробнее.
Если дату-время хранить в виде строки, то возникают следующие проблемы:
Мы начинаем зависеть от формата. Потому что
2022-06-06 16:25:00.000иJun, 2022, 06 16:25- это одно и то же по сути, но совсем не одно и то же в записи в виде строки. А если хранить в виде DateTime - то иJun, 2022, 06 16:25, и2022-06-06 16:25:00.000- это просто два формата одного и того же значенияВозникают проблемы при сравнении "больше-меньше". Ну, просто потому, что строки не обязаны подчиняться тем же правилам, что и значения, которые они представляют. Опять же, результат сравнения зависит от формата.
еще одна проблема со временем, которое хранится в базе данных - это часовые пояса. Даже в "примере с самолётом" есть "локальное" время города, из кторого вылетает рейс, и есть "локальное" время города, куда рейс прилетает. Но на самом делел - это одно ито же время, если хранить его в UTC, например. А про каждый город знать, на сколько часов происходит сдвиг относительно UTC
Поэтому исправлять надо комплексно:
В базе данных переделывааем поле
ДатаВылетана типDateTimeВместо
t1.Parameters.AddWithValue("@dat1", Data1.Text);начинаем использовать что то вродеt1.Parameters.Add("@dat1", SqlDbType.DateTime).Value = dt.Date;Из за того, что теперь у нас в одном поел есть "дата вылета и время вылета", а в поиске пользователь ввводит именно "дату вылета" - нужно в SQL-запросе сделать поиск по диапазону, что то вроде
SELECT * FROM Рейсы WHERE Класс = @CL AND ГородаВылета = @Depcity AND ГородаПрилета = @arrcity AND ДатаВылета>=@dat1 AND ДатаВылета<@dat2
Кроме того, Вас вряд ли интересует именнно время вылета, скорее всего Ваш селект будет спользоваться для заполнения списка рейсов, удовлетворяющих условию, поэтому сделаем сразу SELECT Класс, ГородаВылета, ГородаПрилета, ДатаВылета FROM Рейсы WHERE Класс = @CL AND ГородаВылета = @Depcity AND ГородаПрилета = @arrcity AND ДатаВылета>=@dat1 AND ДатаВылета<@dat2