我的朋友想把她的数据从数据库传输到一个文本框到她的c#程序中,但是它得到了以下错误:
“数据为空。不能对空值调用此方法或属性。”
顺便提一句,这是代码:
sql_command = new MySqlCommand("select sum(lt_min_hours) as TotalLate from tbl_late where (late_date between '" + date_start + "' and '" + date_to + "' and empid = '" + empid + "')", sql_connect);
sql_reader = sql_command.ExecuteReader();
if (sql_reader.Read())
{
textBox_tlate.Text = sql_reader.GetString("TotalLate");
}
else
{
MessageBox.Show("No Data.");
}发布于 2016-02-12 11:55:39
来自文档;
如果没有匹配的行,
SUM()将返回NULL。
但首先,您应该始终使用参数化查询。这种字符串连接对于SQL注入攻击是开放的。
之后,您可以使用ExecuteScalar代替ExecuteReader,后者只返回一行列。在你的情况下,这正是你想要的。
textBox_tlate.Text = sql_command.ExecuteScalar().ToString();还可以使用语句自动释放连接和命令。
发布于 2016-02-12 11:55:22
在将字段分配给textbox之前,需要针对字段测试DbNull.Value。
if (sql_reader.Read())
{
if(!sql_reader.IsDbNull(sql_reader.GetOrdinal("TotalLate")))
textBox_tlate.Text = sql_reader.GetString("TotalLate");
}编辑
根据您的注释,什么都不会发生,因此WHERE条件无法检索任何记录,结果为NULL。
查看您的查询,我假设包含日期的变量被转换为无效格式的字符串。这可以使用ToString和适当的格式字符串(IE: yyyy)来修复,但是正确的处理方法是通过参数化查询。
sql_command = new MySqlCommand(@"select sum(lt_min_hours) as TotalLate
from tbl_late
where (late_date between @init and @end and empid = @id", sql_connect);
sql_command.Parameters.Add("@init", MySqlDbType.Date).Value = date_start;
sql_command.Parameters.Add("@end", MySqlDbType.Date).Value = date_end;
sql_command.Parameters.Add("@id", MySqlDbType.Int32).Value = empid;
sql_reader = sql_command.ExecuteReader(); 这假设date_start和date_end是DateTime变量,empid是整数变量。通过这种方式,参数解析由MySql引擎完成,它知道如何处理DateTime变量。相反,代码使用Net Framework进行的自动转换,默认情况下,该转换使用区域设置将日期转换为字符串。
https://stackoverflow.com/questions/35361879
复制相似问题