#c# #winforms
#c# #winforms
Вопрос:
Я пытаюсь сложить часы работы пользователя за последние 7 дней. Часы хранятся в базе данных в виде десятичной дроби (18,2)
У меня есть правильный SQL-код для этого, поскольку я могу подсчитать его в sql server, но когда я пытаюсь вывести его в окно сообщения в winform, я получаю следующую ошибку
Объект не может быть преобразован из DBNull в другие типы.’
я пытался
private void Hours_Week_btn_Click(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection("****Conn String****");
conn.Open();
SqlCommand comm = new SqlCommand("SELECT SUM (Total_Hours_Day) FROM Sign_In_Out_Table , User_Table WHERE User_Table.FirstName = '" Username_Alerts_lbl.Text "' AND Date between GETDATE()-7 and GETDATE()", conn);
decimal TotalHoursWeek = Convert.ToDecimal(comm.ExecuteScalar());
conn.Close();
decimal sum = 0;
sum = Convert.ToDecimal(TotalHoursWeek);
MessageBox.Show(Username_Alerts_lbl.Text " Hours worked = " TotalHoursWeek);
}
Я ожидаю получить результат, в котором все значения за последние 7 дней в базе данных суммируются и отображаются в окне сообщения
Комментарии:
1. Выполните свой запрос непосредственно к базе данных и посмотрите, какое значение вы получите. Также внимательно прочитайте сообщение об ошибке: объект не может быть преобразован из DBNull в другие типы и попытайтесь понять, что пытается сообщить вам ошибка. Если вы не понимаете, в чем ошибка, найдите эту ошибку в Интернете.
2. Каков тип Total_Hours_Day в базе данных?
3. поле времени в записи может быть нулевым. Пожалуйста, проверьте свои записи
4. Добавьте NVL к сумме, NVL(SUM (Total_Hours_Day),0)… пока вы этим занимаетесь … исправьте также свой риск SQL-инъекции.
Ответ №1:
Эта ошибка является самоописательной и ясно говорит об этом Object cannot be cast from DBNull to Other types
.
Команда Convert.ToDecimal(comm.ExecuteScalar())
состоит из двух частей: первая используется для извлечения данных из базы данных, comm.ExecuteScalar()
которые возвращают объект, а затем Convert.ToDecimal()
пытается преобразовать этот объект в десятичный.
Проблема в том, что ExecuteScalar()
не возвращает десятичный объект, он возвращает объект со значением DBNull.
Возможная причина возврата DBNull из базы данных вместо decimal заключается в том, что в вашем запросе у вас есть два фильтра, и первый фильтр — User_Table. FirstName = Username_Alerts_lbl. Text
и возможно, что FirstName не соответствует в DB, поэтому DB возвращает null.