我的目标是从存储过程中获取报告列表,并将该列表作为JSON返回。我在控制器的其他地方使用了类似的代码,这里的不同之处在于我编写的存储过程需要一个参数,这就是问题所在。
抛出的错误是"System。异常:必须声明标量变量"@DynamicCategoryId";我已经尝试了几种不同的方法来让参数工作,没有运气。
下面是我的代码:[HttpGet]
[Route("GetReports/{categoryId}")]
public string GetReports(int categoryId)
{
List<GetReporsResult> paramaters = new List<GetReporsResult>();
try
{
SqlParameter paramCategoryId = new SqlParameter("@DynamicCategoryId", SqlDbType.Int);
paramCategoryId.SourceColumn = "@DynamicCategoryId";
paramCategoryId.Value = categoryId;
paramCategoryId.Direction = ParameterDirection.Input;
paramaters = context.GetReporsResult.FromSqlRaw("EXEC dbo.GetReports @DynamicCategoryId", paramCategoryId.Value).ToList();
}
catch (Exception e)
{
throw new Exception(e.Message);
}
return JsonConvert.SerializeObject(paramaters);
}
有趣的是,如果我这样做("EXEC dbo)。GetReports";+ categoryId.ToString())可以工作,但这不是一个好的做法。
永远不要使用Parameter。作为参数的值。检查类别id,可能为空。
试试这段代码,它在很多地方被使用了很多次
var paramCategoryId = new SqlParameter("@DynamicCategoryId", categoryId);
paramaters = context.GetReporsResult.FromSqlRaw("EXEC dbo.GetReports @DynamicCategoryId",
paramCategoryId).ToList();
或者我通常用
paramaters = context.GetReporsResult.FromSqlRaw("EXEC dbo.GetReports @DynamicCategoryId",
parameters: new[] { paramCategoryId} ).ToList();