ASP.NET Core参数化方法中@Category标量变量声明及错误解决
解决“Must declare the scalar variable @Category”错误
错误原因很明确:你在SQL语句里使用了@Category参数,但没有在SqlCommand中定义并赋值这个参数,数据库无法识别这个未声明的变量。
按以下步骤修改代码:
- 让接口接收Category参数(通过URL路径或查询参数传递都可以)
- 在
SqlCommand实例中添加@Category参数并赋值
修改后的完整代码示例:
[Route("TotalValue/{category}")] [HttpGet] public decimal TotalValue(string category) { // 如果是要计算总价值,建议把查询改成聚合函数,比如Sum(对应数值字段名),根据你的实际表字段调整 var query = "Select Sum(ValueColumn) from OrderDetail where Category = @Category"; string sqlDataSource = _configuration.GetConnectionString("DefaultConnection"); decimal total = 0; using (SqlConnection con = new SqlConnection(sqlDataSource)) { con.Open(); using (SqlCommand cmd = new SqlCommand(query, con)) { // 在这里添加并赋值参数,推荐指定参数类型的写法,避免类型转换问题 cmd.Parameters.Add("@Category", SqlDbType.VarChar, 50).Value = category; // 简单场景也可以用AddWithValue,但不如指定类型安全 // cmd.Parameters.AddWithValue("@Category", category); using (SqlDataReader dr = cmd.ExecuteReader()) { if (dr.Read() && !dr.IsDBNull(0)) { total = dr.GetDecimal(0); } } } // using块会自动释放连接资源,不需要手动调用con.Close() } return total; }
额外说明:
- 原代码里的
Select *如果是要计算总价值,建议改成聚合查询(比如Sum(数值字段名)),否则读取第一行第一列的decimal值可能不符合你的业务需求 using块会自动处理连接的释放,不需要手动调用con.Close()- 指定参数类型的写法比
AddWithValue更安全,能避免潜在的类型转换错误和SQL注入风险
内容的提问来源于stack exchange,提问作者User_K47
相关产品推荐
相关产品推荐

