MySQL/C#如何判断字段为空并解决MAX查询DBNull转换报错
错误原因
当stktransfer表中没有任何数据时,MAX(trnsno)查询返回的是DBNull.Value,而非普通空值或整数,直接用Field<int>(0)尝试将DBNull转为不可为空的int类型,就会触发该报错。
解决方案
方案1:修改SQL语句(更推荐,无需额外处理空值)
直接在SQL层面判断MAX结果为空时返回0,再加1得到下一个编号,适配你当前的业务逻辑:
-- MySQL 环境使用 IFNULL SELECT IFNULL(MAX(`trnsno`), 0) + 1 FROM stktransfer
如果是其他数据库可以替换对应空值处理函数:
- SQL Server 替换为
ISNULL(MAX(trnsno), 0) + 1 - PostgreSQL/Oracle 替换为
COALESCE(MAX(trnsno), 0) + 1
修改SQL后C#代码可以直接简化,不需要做空值判断:
sql = "SELECT IFNULL(MAX(`trnsno`), 0) + 1 FROM stktransfer"; // 省略原有查询执行逻辑 if (config.dt.Rows.Count > 0) { strTrnsNo = config.dt.Rows[0][0].ToString(); }
方案2:仅修改C#代码,兼容DBNull场景
如果不想改动SQL,可以将取值类型改为可空intint?,再判断是否有值:
if (config.dt.Rows.Count > 0) { int? maxTrnsNo = config.dt.Rows[0].Field<int?>(0); if (maxTrnsNo == null) { strTrnsNo = "1"; } else { strTrnsNo = (maxTrnsNo.Value + 1).ToString(); } }
内容的提问来源于stack exchange,提问作者Mang
相关产品推荐
相关产品推荐

