返回的参数格式不正确
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
返回的结果将是 int
或 null
。此外,不需要通过字符串进行往返。但是我们必须检查null
。
最近版本的 C# 中引入了模式匹配,允许在许多情况下使用更简洁的代码:
count = cmd.ExecuteScalar() is int i ? i : 0;
如果标量是一个装箱的int
对象,它将被强制转换为int
并分配给新变量i
,is
表达式的结果将是true
。我们在三元表达式中使用这个结果来确定最终结果。
还有一种可能:
count = (cmd.ExecuteScalar() as int?) ?? 0;
如果转换成功,运算符as
将输入转换为所需的类型,否则返回null
。因此目标类型必须可以为空。因此我们指定int?
(= Nullable<int>
) 作为目标类型。我们使用空合并运算符??
将null
转换为0
。
【讨论】:
以上是关于返回的参数格式不正确的主要内容,如果未能解决你的问题,请参考以下文章