ColdFusion: cfqueryparam для двоичных значений

Я написал приведенный ниже запрос на основе справки, представленной в этой ссылке, запросив двоичный столбец, используя как в SQL Server

SELECT * FROM myTable
WHERE TestData >= 0x00010000 
  AND TestData < 0x00020000;

Он вернул ожидаемые результаты. я использовал cfqueryparam и обновил запрос как:

SELECT * FROM myTable
WHERE TestData >= <cfqueryparam value="0x00010000" cfsqltype="cf_sql_binary"> 
  AND TestData < <cfqueryparam value="0x00020000" cfsqltype="cf_sql_binary">;

но он вернулся с ошибками, сообщение об ошибке: Invalid data 0x00010000 for CFSQLTYPE CF_SQL_BINARY.Я пробовал с cfsqltype="CF_SQL_BLOB" но нет результатов. Как исправить эту проблему? заранее спасибо

1 ответ

В сущности, в сохранении запроса нет ничего плохого:

SELECT * FROM myTable
WHERE TestData >= 0x00010000 AND TestData < 0x00020000

(В идеале вы должны перечислять отдельные столбцы, а не использовать * хоть.)

Тем не менее, хотя параметризация этих запросов не дает преимущества в плане безопасности (они не имеют переменных и, следовательно, не склонны к внедрению SQL-кода), все же может быть преимущество использования параметризованного SQL для целей кэширования единого плана выполнения.

Если у вас есть несколько запросов, в форме:

<cfquery...>
    SELECT * FROM myTable
    WHERE TestData >= 0x00010000 AND TestData < 0x00020000
</cfquery>

<cfquery...>
    SELECT * FROM myTable
    WHERE TestData >= 0x00020000 AND TestData < 0x00030000
</cfquery>

<cfquery...>
    SELECT * FROM myTable
    WHERE TestData >= 0x00030000 AND TestData < 0x00040000
</cfquery>

Использование cfqueryparam для них позволит кэшировать один план выполнения для нескольких запросов, что может привести к повышению производительности.

В этой ситуации вам нужно использовать BinaryDecode для преобразования вашей шестнадцатеричной строки в двоичное значение, которое может обрабатывать cfqueryparam, например:

<cfquery...>
    SELECT * FROM myTable
    WHERE TestData >= <cfqueryparam value=#BinaryDecode('00010000','Hex')# cfsqltype="cf_sql_binary" />
    AND   TestData <  <cfqueryparam value=#BinaryDecode('00020000','Hex')# cfsqltype="cf_sql_binary" />
</cfquery>

(Обратите внимание, что 0x префикс опущен.)

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