2013-04-26 3 views
2

J'ai écrit la requête ci-dessous en fonction de l'aide fournie dans ce lien, querying binary column using like in sql serverColdFusion: cfqueryparam pour les valeurs binaires

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

Il a donné les résultats attendus. Je cfqueryparam et mis à jour la requête comme:

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

mais il est revenu avec des erreurs, le message d'erreur: Invalid data 0x00010000 for CFSQLTYPE CF_SQL_BINARY. J'ai essayé avec cfsqltype="CF_SQL_BLOB" mais aucun résultat. Comment réparer ce problème? Merci à l'avance

+3

L'erreur est probablement parce que vous passez une chaîne, pas une valeur binaire. Essayez '#BinaryDecode ('00010000', 'Hex') #'? –

+0

Vous n'aurez peut-être pas besoin d'utiliser cfqueryparams ici - si les valeurs sont statiques (non fournies dynamiquement par un tiers), et vous n'avez pas plusieurs requêtes avec seulement les valeurs changeantes (ie SQL identique sauf pour les valeurs binaires), alors il n'y a probablement aucun avantage à le faire. –

+0

Merci son fonctionnement. vous avez raison, pour les valeurs statiques, il n'y a aucun avantage. Mais toujours notre client veut cette fonctionnalité. Encore merci. – RajVish

Répondre

3

En l'état actuel, il n'y a rien de mal à garder la requête comme: (. Vous devriez idéalement être la liste des colonnes individuelles plutôt que d'utiliser * bien)

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

Cependant, tout en il n'y a aucun avantage de sécurité à paramétrer ces requêtes (elles n'ont pas de variables et ne sont donc pas sujettes à l'injection SQL), il peut y avoir un avantage à avoir un SQL paramétré pour mettre en cache un plan d'exécution unique.

Si vous avez plusieurs requêtes, de la forme:

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

Utilisation cfqueryparam pour ces permettrait un seul plan d'exécution à être mis en cache pour les requêtes multiples, pouvant conduire à une meilleure performance.

Dans cette situation, vous devez utiliser BinaryDecode pour convertir votre chaîne hexadécimale en une valeur binaire qui cfqueryparam peut gérer, comme suit: (. Notez que le préfixe 0x est omises)

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

Questions connexes