В 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);
}
Запрос теперь работает правильно, возвращает правильные строки, а используемые параметры отображаются в дампе...