在Scripted Coldfusion Query中 - 为什么queryParams不会被添加?

时间:2014-04-02 16:57:07

标签: coldfusion coldfusion-9 cfml cfdump

我有一个动态生成的查询,除了一个参数之外的所有参数都是可选的,只有一个必填字段。 我以为我会很聪明,但很奇怪。

-cfscript
// Standard new query(), set name, datasource etc

query.addParam(value=requiredParam, type=cf_sql_varchar);
sqlStatement = "select ....";

if (optional field 2){
    sqlStatement &= "and field like '%?%' ";
    query.addParam(value=optionalValue, type=cf_sql_varchar);
}
... optional fields 2,3,4,5 repeats ...
query.execute(sql=sqlStatement);

因此,当我执行仅传递必需字段时,查询与结果一样正确。 dump只显示sqlParameter中的必需条目(带有2个结果)

当我使用可选参数添加调用时,只显示第一个(显示必需参数)。未显示可选参数(在结果转储中),结果集将显示为0行。 (很奇怪)

我用调试器跟踪它(来自cf8扩展,cfeclipse,而不是构建器,在CF9独立版上)

可选字段逻辑正确,代码已经过测试和执行。 在变量窗格中,params似乎被正确添加但不会显示在结果查询中(在结果页面上转储)只显示所需的。

我猜是发生了奇怪的事情,但这没有意义。 是否可能必须将所有addParams一起添加? 类似(语法)是问题吗?

为什么使用ifs / conditional会阻止额外的addParams无法工作/ showup? dump的一些奇怪的显示问题?

很抱歉没有在敏感区域提供真实代码。

2 个答案:

答案 0 :(得分:2)

如果您有多个字段,我认为最好使用name参数:

if (optional field 1) {
    sqlStatement &= "AND Field LIKE :field1 ";
    query.addParam( name="field2", value="%#optionalvalue#%", type=cf_sql_varchar);

}
if (optional field 2) {
    sqlStatement &= "AND Field LIKE :field2 ";
    query.addParam( name="field2", value="%#optionalvalue#%", type=cf_sql_varchar);
}

好读:http://www.bennadel.com/blog/1678-Learning-ColdFusion-9-Using-CFQuery-And-Other-Service-Tags-In-CFScript.htm

请注意在某些情况下在语句中放置一个空格的错误。

答案 1 :(得分:1)

PEBKAC ......

if (optional field 2){
    sqlStatement &= "and field like '%?%' ";
    query.addParam(value=optionalValue, type=cf_sql_varchar);
}

应该是:

if (optional field 2){
    sqlStatement &= "and field like ? ";
    query.addParam(value='%#optionalValue#%', type=cf_sql_varchar);
}

查询现在可以正常工作,返回正确的行,并且所使用的参数显示在转储...