You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 22:45:02