2009-02-17 7 views
0

Je construis (C#) sql sélectionnez les chaînes de commandes à la volée en utilisant LIKE% somestring% conditions. Dans mes chaînes de recherche je veux être capable de gérer n'importe quel personnage trouvé sur un clavier PC (US) standard (y compris ~! @ #% Etc., alt-caractères spéciaux non requis mais serait bien d'avoir). Je sais que les guillemets simples doivent être doublés et peut-être aussi les guillemets doubles. Quelles autres corrections de chaînes peuvent être nécessaires pour garantir une syntaxe correcte?C#: quelle est la bonne façon d'effectuer des recherches sql sql en utilisant des caractères

Répondre

5

Aucun correctifs requis:

SqlCommand cmd = new SqlCommand("select * from Foo where Bar like @p", connection); 

SqlParameter p = new SqlParameter(); 
param.ParameterName = "@p"; 
param.Value = pattern; 

cmd.Parameters.Add(param); 
+1

Ne devrait-il pas être "select * from Foo où barre comme '%' + @p + '%'"? – Loris

+0

J'étais au courant des requêtes paramétrées. Je pourrais le faire, mais le code serait compliqué. J'ai plusieurs champs à rechercher, et un nombre défini par l'utilisateur de chaînes à rechercher dans n'importe quel champ. Je devais générer des paramètres d'entrée et des noms de paramètres de manière dynamique lorsque je faisais une boucle dans les chaînes. –

+0

Alors, quel est le problème? En concaténant la chaîne de requête, vous ouvrez un trou de sécurité énorme dans votre application. Si cela vous convient, alors allez-y. –

2

En plus de doubler les apostrophes (ou à l'aide d'une requête paramétrée), est-ce que l'utilisateur sait que « _ » et « % » sont des jokers (tout caractère et zéro ou-plus-tous-caractères respectivement), et que "[...]" crée une fermeture?

pour échapper à ces caractères, il existe deux voies

WHERE Foo LIKE '%xxx\%yyy%' ESCAPE '\' 

ou OÙ Foo LIKE '% xxx [%] yyy%'

le second utilise l'effet secondaire de la création d'une fermeture et évite avoir à utiliser l'ESCAPE (qui en soi a besoin de réflexion pour choisir un caractère qui ne soit pas en conflit avec le reste de la chaîne, ou est lui-même échappé où il se produit)

Notez que l'utilisation de 'LIKE% somestring%' sera généralement exiger un balayage de table, et peut donc conduire à des problèmes de performance - par ex. si vous avez des millions de lignes à vérifier.

Dans SQL Server, vous pouvez utiliser sp_ExecuteSQL si vous générez des clauses WHERE par chaîne-concaténation - de sorte que seuls les champs pour lesquels l'utilisateur spécifie des critères sont inclus. sp_ExecuteSQL met en cache la requête et, le plus souvent, améliore les performances. (s'il vous plaît demander si cela est pertinent et vous avez besoin d'aide)

+0

J'essaie de garder le code aussi générique que possible. J'utilise subsonic orm avec des bases de données sql express et sqlite. Je n'aurai que 20K lignes à chercher et la performance est très bonne jusqu'à présent. –

+0

OK, ignorez sp_ExecuteSQl (qui est spécifique à MSSQL). Le reste de mes commentaires devrait être vrai pour toutes les saveurs de SQL. Il est important de garder un œil sur la durée de votre recherche de caractères génériques lorsque la taille de la base de données augmente. – Kristen

Questions connexes