Как мне сложить десятичные значения из базы данных

#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.