如何从数据库中添加十进制值

时间:2019-04-24 11:28:07

标签: c# winforms

我正在尝试累计用户过去7天的工作时间。小时数以十进制(18,2)的形式存储在数据库中

我对此具有正确的SQL代码,因为我可以在sql服务器中进行统计,但是当我尝试将其输出到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天的值全部累加并显示在messageBox中

1 个答案:

答案 0 :(得分:1)

此错误是自描述性的,并明确指出Object cannot be cast from DBNull to Other types

命令Convert.ToDecimal(comm.ExecuteScalar())有两个部分,第一个用于从db获取数据的是comm.ExecuteScalar(),它返回一个对象,然后Convert.ToDecimal()试图将该对象转换为十进制。

问题是ExecuteScalar()没有返回小数对象,而是返回具有DBNull值的对象。

从数据库中返回DbNull而不是十进制的可能原因是在查询中您有两个过滤器,而第一个过滤器是User_Table. FirstName = Username_Alerts_lbl. Text,并且数据库中的FirstName可能不匹配,这就是DB返回null的原因。