返回的参数格式不正确

Posted

技术标签:

【中文标题】返回的参数格式不正确【英文标题】:Parameter returning not in the correct format 【发布时间】:2021-12-14 16:13:10 【问题描述】:

我有一个异步任务方法,可以查询数据库表以获取特定列中的积分总数。我在用于查询的方法中有一个字符串参数,用于识别登录的用户,该参数存储在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

【问题讨论】:

cmd.ExecuteScalar() 返回的原始值是多少? 我在数据库中还没有任何值,但我什至不知道返回了什么,因为我在任何东西都可以返回之前得到了异常 如果表中没有数据,我希望它返回 0 如果没有其他方法,请找出异常发生在 Count_Credits 中的哪一行。是int.Parse,还是跟SQL查询有关? 带参数的方法出现异常,sql或解析附近没有异常 【参考方案1】:

在转换类型之前,您需要检查是否从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;

【讨论】:

我把 await 放在哪里有影响吗 TBH 这应该在查询本身中修复。用户提到:What I want to have it returned is 0 if no data is in the table 可以通过更改查询轻松完成。 或模式匹配if(cmd.ExecuteScalar() is int i) count = i; @OlivierJacot-Descombes - 同意。只是不想进入更高级的领域。 @OlivierJacot-Descombes 你能发表你的评论作为答案吗【参考方案2】:

ExecuteScalar 返回的结果将是 intnull。此外,不需要通过字符串进行往返。但是我们必须检查null

最近版本的 C# 中引入了模式匹配,允许在许多情况下使用更简洁的代码:

count = cmd.ExecuteScalar() is int i ? i : 0;

如果标量是一个装箱的int 对象,它将被强制转换为int 并分配给新变量iis 表达式的结果将是true。我们在三元表达式中使用这个结果来确定最终结果。


还有一种可能:

count = (cmd.ExecuteScalar() as int?) ?? 0;

如果转换成功,运算符as 将输入转换为所需的类型,否则返回null。因此目标类型必须可以为空。因此我们指定int? (= Nullable&lt;int&gt;) 作为目标类型。我们使用空合并运算符??null 转换为0

【讨论】:

以上是关于返回的参数格式不正确的主要内容,如果未能解决你的问题,请参考以下文章

导入 db phpMyAdmin - 错误格式参数不正确

AWS CLI docker:参数格式不正确

s-s-rS 返回不正确的 WW

DTrace - 如何在返回探针中正确检索初始参数

web3.eth.abi.decodeLog 返回不正确的日志参数值

苏康码显示params参数加密不正确