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
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);
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)
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. –
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
- 1. Quelle est la bonne façon de rediriger?
- 2. Quelle est la bonne façon de charger un ListBox?
- 3. Quelle est la bonne méthode de lecture et d'analyse des fichiers de données en C++?
- 4. Quelle est la bonne façon de créer une méthode BUILDARGS en utilisant MooseX :: Declare?
- 5. Quelle est la meilleure façon d'implémenter cette requête SQL?
- 6. Quelle est la bonne façon de sauvegarder les blobs ZODB?
- 7. Quelle est la bonne façon de gérer la version d'assemblage?
- 8. Quelle est la bonne façon d'écrire du HTML en utilisant Javascript?
- 9. Quelle est la bonne façon de relier 2 objets javascript?
- 10. Quelle est la bonne façon d'utiliser les champs de bits en C?
- 11. en utilisant des scripts sql en javascript
- 12. Quelle est la meilleure façon de stocker des données d'historique dans SQL Server 2005/2008?
- 13. Quelle est la meilleure façon d'effectuer des calculs sur une date planifiée dans SQL Server?
- 14. Quelle est la meilleure façon d'ajouter des guillemets doubles dans SQL Server 2000
- 15. Quelle est la bonne façon d'écrire ce code?
- 16. Quelle est la bonne façon de traiter les permissions?
- 17. Quelle est la bonne façon d'encapsuler [NSString stringWithFormat:]?
- 18. Quelle est la bonne façon de disposer d'une fenêtre WPF?
- 19. Quelle est la bonne façon d'inclure un email dans Javadoc?
- 20. Obtenir des statistiques horaires en utilisant SQL
- 21. Quelle est la bonne façon d'installer des gemmes dans un GC Patched ruby?
- 22. Quelle est la bonne façon d'obtenir des messages à partir d'un mur facebook spécifique?
- 23. Quelle est la bonne façon d'intégrer des images PHPMailer avec un e-mail HTML?
- 24. Quelle est la bonne façon de vérifier si mysql_query() a retourné des résultats?
- 25. Quelle est la meilleure façon d'extraire des commentaires de cellules Excel en utilisant Perl ou Ruby?
- 26. Quelle est la bonne façon d'ajouter des liens supplémentaires FIND-à easy_install lorsqu'il est appelé en fonction?
- 27. Quelle est la bonne façon de tester si un objet est un objet jQuery en javascript?
- 28. Quelle est la meilleure façon d'écrire [0..100] en C#?
- 29. Zend Lucene échoue toutes les recherches avec des caractères spéciaux
- 30. Quelle est la bonne façon de minimiser pour ramasser une application C# WinForms?
Ne devrait-il pas être "select * from Foo où barre comme '%' + @p + '%'"? – Loris
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. –
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. –