2

このリンクで提供されているヘルプに基づいて以下のクエリを作成し、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"たが、結果はありません. この問題を解決するにはどうすればよいですか? 前もって感謝します

4

1 に答える 1

3

現状では、クエリを次のように維持しても本質的に問題はありません。

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を使用して、16 進文字列を 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(接頭辞は省略されていることに注意してください。)

于 2013-04-26T22:06:29.410 に答える