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

问题描述 投票:0回答:1

我想补充用户过去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天的值全部统计并显示在messageBox中

c# winforms
1个回答
1
投票

这个错误是自我描述的,并清楚地说,Object cannot be cast from DBNull to Other types

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

问题是ExecuteScalar()没有返回一个十进制对象,它返回一个具有DBNull值的对象。

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

© www.soinside.com 2019 - 2024. All rights reserved.