为什么我在使用CFScript时不能在同一查询的两个位置使用相同的cfqueryparam?

时间:2011-02-17 05:03:39

标签: coldfusion coldfusion-9

我不确定我是否做错了什么,但如果你用CFScript写的话,似乎你不能在一个查询中多次使用cfqueryparam。

此行为与CFML不一致。我刚刚从CFML重写了一个类似的查询到CFScript,我收到以下错误:cfsqlparam 'id' is not defined

local.query = new Query();
local.query.setSql("
    SELECT id
    FROM myTable
    WHERE myTable.id = :id OR myTable.parentId = :id
");
local.query.addParam(name="id", cfsqltype="CF_SQL_INTEGER", value=arguments.id, maxlength=10);
local.query.execute().getResult();

如果我取出OR myTable.parentId = :id,它的效果非常好。我是否必须为我打算使用的每个位置创建一个参数?

1 个答案:

答案 0 :(得分:7)

如果是CFQuery,那么每个值都有一个cfqueryparam:

where myTable.id = <cfqueryparam... value="#arguments.id#" />
    or myTable.parentid = <cfqueryparam ... value="#arguments.id#" />

所以我猜你需要在脚本中做同样的事情:

local.query.setSql("
    SELECT id
    FROM myTable
    WHERE myTable.id = :id OR myTable.parentId = :pid "); 
local.query.addParam(name="id", cfsqltype="CF_SQL_INTEGER",value=arguments.id,maxlength=10); 
local.query.addParam(name="pid",cfsqltype="CF_SQL_INTEGER",value=arguments.id,maxlength=10); 

关于“为什么一个addParam不能解决占位符问题”的问题我猜测它归结为ColdFusion如何解析查询 - 因为你指定了两个param占位符,解析器可能希望找到两个params定义。