1

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

-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);

所以当我执行只传递必填字段时,查询是正确的,结果也是正确的。转储仅显示 sqlParameter 中所需的条目(有 2 个结果)

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

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

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

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

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

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

4

2 回答 2

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

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

于 2014-04-02T21:58:07.107 回答
1

皮比克...

写的

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);
}

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

于 2014-04-02T17:08:27.550 回答