【问题标题】:API returns Must declare the scalar variable errorAPI 返回必须声明标量变量错误
【发布时间】:2019-08-15 08:24:14
【问题描述】:

我正在使用 Entity Framework Core 并尝试执行具有两个过滤器参数的查询并返回响应。我正在从 Angular 应用程序调用我的 API。

以上两者都可以作为查询传递给 EF Core,或者用户可能只选择一个字段,然后相应地过滤器应该更改

我正在做的如下所示

    public List<ShipmentDetailByShipDate> GetByQueryFilter(string queryPara)
    {
        var queryParameter = new SqlParameter("queryPara", queryPara);
        return _context.ShipmentDetailsByShipDate.FromSql<ShipmentDetailByShipDate>(SQueryPara, queryParameter).ToList();
    }

字符串SQuerPara 保存查询的位置

        SQueryPara = @"Select prj_number,location from sTable where @queryParameter group by prj_number,location";

我的控制器方法是这样的

    public IActionResult GetByQueryFilter()
    {
        string queryPara = "r_proj = '000634' and sdate = '2019-07-01'";
        return Ok(_shipmentRepository.GetByQueryFilter(queryPara));
    }

出于测试目的,我在控制器中对queryPara 进行了硬编码。但是当我调用我的 API 时,我收到了类似的错误 System.Data.SqlClient.SqlException: 'Must declare the scalar variable "@queryParameter".'

我该如何处理这种情况,可以用不同的方式处理吗?

【问题讨论】:

  • @queryPara != @queryParameter
  • 好的。这似乎是XY problem

标签: c# entity-framework asp.net-core asp.net-web-api


【解决方案1】:
"@queryPara" != "@queryParameter"; 

您将"queryPara" 作为参数中的名称传递

var queryParameter = new SqlParameter("queryPara", queryPara);

但在语句中使用@queryParameter

"...where @queryParameter group by..."

SqlParameter 的名称需要与使用的 is 语句相匹配。

var queryParameter = new SqlParameter("queryParameter", queryPara);

但是考虑到你正在传递类似

的东西
string queryPara = "r_proj = '000634' and sdate = '2019-07-01'"

进入查询,这将为您提供以下内容

在预期条件的上下文中指定的非布尔类型的表达式

因为语句构造不正确。

考虑重构使用的方法。

构造适当的参数化语句,避免 SQL 注入攻击

public List<ShipmentDetailByShipDate> GetByQueryFilter(string query, SqlParameter[] parameters = null) {
    if (parameters != null && parameters.Length > 0) {        
        return _context.ShipmentDetailsByShipDate.FromSql<ShipmentDetailByShipDate>(query, parameters).ToList();
    }

    return return _context.ShipmentDetailsByShipDate.FromSql<ShipmentDetailByShipDate>(query).ToList();
}

并相应地构建您的过滤器。

public IActionResult GetByQueryFilter() {
    string query = @"Select prj_number,location from sTable where r_proj = @r_proj and sdate = @sdate group by prj_number,location";
    var parameters = new [] {
        new SqlParameter("r_proj", "000634"),
        new SqlParameter("sdate", "2019-07-01"),
    }
    return Ok(_shipmentRepository.GetByQueryFilter(query, parameters));
}

【讨论】:

  • 我现在得到: 'An expression of non-boolean type specified in a context where a condition is expected, near 'group'.'
  • @trx 您不能将表达式作为参数传递。使用参数的原因之一是为了防止这种情况发生。目前,您生成的 SQL 实际上是 Select prj_number,location from sTable where 'r_proj = ''000634'' and sdate = ''2019-07-01''' group by prj_number,location,这没有任何意义。您应该将r_projsdate 作为单独的参数传递,并在查询中将它们引用为where r_proj = @rproj AND sdate = @sdate
  • @John yep 意识到,一旦接受答案并发表评论,但由于接受而无法删除,因此我可以编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-06
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多