В Scripted Coldfusion Query - почему бы не добавить queryParams?

У меня динамически сгенерированный запрос, все параметры, кроме одного, необязательны с одним обязательным полем. Я думал, что буду умным, но случается что-то очень странное.

-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, а не builder, на автономном CF9)

Необязательная логика поля была правильной, код был протестирован и выполнен. В панели переменных параметры, казалось, были добавлены правильно, но они не отображаются в результате запроса (сброс на странице результатов) только требуемый.

Я предполагаю, что происходит что-то странное, но это не имеет смысла. Возможно ли, что все addParams должны быть добавлены вместе? Является ли подобное (синтаксис) проблемой?

Почему работа с ifs/conditional препятствует тому, чтобы дополнительные addParams не работали / показ? Какая-то странная проблема с отображением из дампа?

Извините за не предоставление реального кода, в чувствительной области.

2 ответа

Если у вас есть несколько полей, я думаю, что было бы лучше использовать параметр имени:

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

Обратите внимание на ошибку, заключающуюся в том, что в некоторых случаях в выражении указывается пробел:

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

Запрос теперь работает правильно, возвращает правильные строки, а используемые параметры отображаются в дампе...

Другие вопросы по тегам