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

C#异步查询数据库学分总和报Input string was not in correct格式错误如何解决

问题根因
  • 异常本质来自Count_Credits方法内部的int.Parse调用,异步方法的异常会在await时向外传播,所以堆栈显示异常抛出在await行,和后续的数据绑定逻辑无关。
  • 核心触发原因:当SQL查询没有匹配到对应学号的记录,或所有匹配记录的Module_Credit字段均为NULL时,SUM函数返回DBNull类型的结果。此时调用.ToString()得到空字符串,int.Parse无法解析空字符串,直接抛出格式错误异常。
  • 非直接问题:异步方法内使用了同步的ExecuteScalar方法,不符合异步编程规范,会造成不必要的线程阻塞。
修复方案

你可以直接用Convert.ToInt32替代int.Parse逻辑,前者会自动处理DBNull为0,同时替换为异步执行方法,修复后代码如下:

private async Task<int> Count_Credits(string student_number)
{
    int count = 0;
    string sql = "SELECT SUM(Module_Credit) AS TOTAL_CREDITS FROM Module_Data WHERE Student_Number=@num";

    using (var conn = new SqlConnection(connString))
    using (var cmd = new SqlCommand(sql, conn))
    {
        cmd.Parameters.Add("@num", SqlDbType.VarChar, 55).Value = student_number;
        await conn.OpenAsync();
        var result = await cmd.ExecuteScalarAsync();
        count = Convert.ToInt32(result);
    }
    return count;
}

如果需要更严谨的校验避免Module_Credit存在非整数值的异常,可以增加TryParse判断:

private async Task<int> Count_Credits(string student_number)
{
    int count = 0;
    string sql = "SELECT SUM(Module_Credit) AS TOTAL_CREDITS FROM Module_Data WHERE Student_Number=@num";

    using (var conn = new SqlConnection(connString))
    using (var cmd = new SqlCommand(sql, conn))
    {
        cmd.Parameters.Add("@num", SqlDbType.VarChar, 55).Value = student_number;
        await conn.OpenAsync();
        var result = await cmd.ExecuteScalarAsync();
        if (result != DBNull.Value && result != null)
        {
            int.TryParse(result.ToString(), out count);
        }
    }
    return count;
}

内容的提问来源于stack exchange,提问作者PureWare -Legends Of Gaming

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:54:02