最初为我的 Oracle SQL 后端编写了一堆查询,并且开始时没有使用参数化查询,而我只是在做一些设计和功能探索。现在我认为我已经得到了我想要的,我开始重构这些查询以进行参数化并防止注入。我的一些查询可能有点复杂,需要使用 where 子句并检查列表。
我遵循了位于此处的 Dapper 文档:https://www.learndapper.com/parameters#dapper-where-in-parameters
在不暴露我的整个查询的情况下,这是 where 子句:
WHERE
WR.WLOPST IN @OpStatus
AND WO.WASRST IN @WoStatus
AND TRIM(WL.MCRP01) IN @Plants
AND WC.IWMCUW IN @Depts
AND WR.WLMCU IN @WorkCenters
AND WR.WLDRQJ >= @DateStart AND WR.WLDRQJ <= @DateEnd
这是 SQL 调用:
var dispatchList = await cnx.QueryAsync<DispatchList>(query.query,
new
{
OpStatus = query.OpStatus,
WoStatus = query.WOStatus,
Plants = query.plants,
Depts = query.departments,
WorkCenters = query.workcenters,
DateStart = query.dateStart,
DateEnd = query.dateEnd
});
dispatchListDTOs = _mapper.Map<IEnumerable<DispatchList>, List<DispatchListDTO>>(dispatchList);
查询对象是我编写的一个类,用于包含 SQL 和参数,如下所示:
public class DispatchListQuery : Query
{
// Inherits public string query {get; set;}
public string[] departments { get; set; }
public string[] plants { get; set; }
public string[] workcenters { get; set; }
public string[] OpStatus { get; set; }
public string[] WOStatus { get; set; }
public int dateStart { get; set; }
public int dateEnd { get; set; }
.....
}
我收到错误
ORA-00936: 缺少表达式
我之前曾尝试使用 Dapper 参数列表,但从未能够让它们工作。
我可以将 SQL 复制到 Oracle SQL Developer 中,并将参数替换为实际列表,并且 SQL 运行良好。
我在这里缺少什么?
修复 Oracle 支持“:”作为参数,但不支持“@”。不确定 dapper 是否在我见过的他们的文档中提到了这一点,但如果他们这样做了那就太好了。
WHERE WR.WLOPST IN :OpStatus AND
WO.WASRST IN :WoStatus AND
TRIM(WL.MCRP01) IN :Plants AND WC.IWMCUW IN :Depts AND WR.WLMCU IN :WorkCenters
AND WR.WLDRQJ >= :DateStart AND WR.WLDRQJ <= :DateEnd
ORDER BY WR.WLDOCO";
parameters = new Dapper.DynamicParameters();
parameters.Add(":OpStatus", OpStatus);
parameters.Add(":WoStatus", WOStatus);
parameters.Add(":Plants", plants);
parameters.Add(":Depts", departments);
parameters.Add(":WorkCenters", workcenters);
parameters.Add(":DateStart", dateStart);
parameters.Add(":DateEnd", dateEnd);
var distpatchList = await cnx.QueryAsync<DispatchList>(query.query, query.parameters);
问题在于 Oracle 不支持“@”。 Oracle 仅支持“:”作为参数。为此,您必须创建一个 DynamicParameters() 对象并向其中添加参数。然后将对象传递给查询本身。