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
相关产品推荐
相关产品推荐

