我正在尝试累计用户过去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中
答案 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的原因。