簡體   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