我想补充用户过去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中
这个错误是自我描述的,并清楚地说,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的原因。