对象不能从 DBNull 转换为 C# 中的其他类型

Posted

技术标签:

【中文标题】对象不能从 DBNull 转换为 C# 中的其他类型【英文标题】:Object cannot be cast from DBNull to other types in C# 【发布时间】:2022-01-07 20:58:34 【问题描述】:

我写了这段代码:

 mysqlCommand command1 = new MySqlCommand("SELECT SUM(standard_one) FROM `challenge` WHERE (SELECT DAYOFWEEK(date)=1) AND challenge_id = @challenge_id and username = @username", db.getConnection());
                command1.Parameters.Add("@challenge_id", MySqlDbType.Int32).Value = comboBox1.SelectedItem;
                command1.Parameters.Add("@username", MySqlDbType.VarChar).Value = globals.username;

问题是有时此命令返回 null。

如何检查命令是否返回 null?如果是,它返回 0?

【问题讨论】:

你可以对照DBNull.Value进行检查 更多详情请见this question。 【参考方案1】:

如果该命令将返回 null?如果是,它返回 0?

制作 SQL:

SELECT COALESCE(SUM(standard_one), 0) ...

请记住,您将无法区分“没有与 where 子句匹配的值”和“匹配的所有值的总和为 0”。如果这很重要,您要么需要合并到总和中永远不会出现的不同值,例如 -2_147_483_648,要么坚持你所拥有的并在 C# 端检查 null

var x = command1.ExecuteScalar();
if(x == null || x.GetType() == typeof(System.DBNull))
  ...
else
  ..cast to int etc.. 

【讨论】:

以上是关于对象不能从 DBNull 转换为 C# 中的其他类型的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Visual Basic 代码将对象从 DBNull 转换为其他类型

[C#] 如何优雅的解决 DBNull 问题

[C#] 如何优雅的解决 DBNull 问题

InvalidCastException:无法将“System.DBNull”类型的对象转换为“System.Nullable`1[System.Int32]”[重复]

C# 数据库访问:DBNull 与 null

尝试使用 COM-interop 从 C# 库中附加 vb6 中的对象时,获取“无法将 'Field' 转换为 'Field' 类型(同一类)”