繁体   English   中英

数据为空。 无法在Null值上调用此方法或属性(mysql至文本框)

[英]Data is Null. This method or property cannot be called on Null value (mysql to textbox)

我的朋友想将她的数据从数据库传输到文本框,然后用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.");
}

文件 ;

如果没有匹配的行, SUM()将返回NULL

但首先,您应该始终使用参数化查询 这类字符串连接对SQL注入攻击开放。

之后,您可以使用ExecuteScalar而不是ExecuteReader ,后者仅返回一列和一行。 就您而言,这正是您想要的。

textBox_tlate.Text = sql_command.ExecuteScalar().ToString();

也可以使用using语句自动配置您的连接和命令。

您需要先针对您的字段测试DbNull.Value,然后再将其分配给文本框

if (sql_reader.Read())
{
    if(!sql_reader.IsDbNull(sql_reader.GetOrdinal("TotalLate")))
        textBox_tlate.Text = sql_reader.GetString("TotalLate");
}

编辑
根据您的评论,什么都不会发生,因此WHERE条件无法检索任何记录,结果为NULL。
查看您的查询,我想您的包含日期的变量将转换为无效格式的字符串。 可以使用ToString和正确的格式字符串(即yyyy-MM-dd)解决此问题,但正确的处理方法是通过参数化查询

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_startdate_end是DateTime变量,而empid是整数1。 这样,参数解析是由知道如何处理DateTime变量的MySql引擎完成的。 相反,您的代码使用Net Framework进行的自动转换,默认情况下,该转换使用区域设置将日期转换为字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM