首页 > 解决方案 > 返回的参数格式不正确

问题描述

我有一个异步任务方法,可以查询数据库表以获取特定列中的 Credits 总量。我在用于查询的方法中有一个字符串参数,用于识别登录的用户,该参数存储在Properties.Settings.Default.Student_Number;. 数据库中学生编号的列是一个 varchar,而在我的代码中的其他任何地方都是一个字符串,但我得到一个异常说Input string was not in correct format。知道我做错了什么

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();

        count = int.Parse(cmd.ExecuteScalar().ToString());
    }

    return count;
}

我如何调用该方法

Task<int> count_credits = Count_Credits(Student_Number);
module_info.Total_Credits = await count_credits; //Exception Goes to this line

我在标签上使用绑定

module_info.Total_Credits

标签: c#sqlasync-await

解决方案


ExecuteScalar在转换类型之前,您需要检查是否返回了结果。

object result = cmd.ExecuteScalar();
if(result != null)
{
  count = (int)result;
}

要进行更简洁的检查,请使用模式匹配(根据 Olivier 的评论):

if(cmd.ExecuteScalar() is int i) 
{ 
  count = i; 
}

此外,您应该await在获取值时使用方法本身:

int count_credits = await Count_Credits(Student_Number);
module_info.Total_Credits = count_credits;

推荐阅读