11
votes

Comment utiliser la variable de chaîne dans l'instruction SQL

J'ai une application WPF dans laquelle je reçois

query = " Select * From Table Where Title = someone "


6 commentaires

Tu ne devrais pas! Avez-vous déjà entendu de l'injection SQL ou des requêtes paramétrées?


Oui, c'est une très mauvaise pratique


Cette question est trop large, cela équivaut à accéder aux données de SQL Server en fonction de la saisie de l'utilisateur dans une application WPF. Il y a des livres entiers qui viennent de couvrir cela.


Ici, vous pouvez lire des exemples d'injection SQL en.wikipedia.org/wiki/sql_injection


Je me sens stupide maintenant: D Ben


Le débordement de la pile vous fera cela, avec de telles personnes agréables dans la communauté. Plus la réputation est élevée la réponse plus charnue. aimer les réponses qui n'ont aucune critique ou réponses constructives du tout; Ils vous disent plutôt que vous êtes stupide, ce que vous faites est faux, ou fermez votre question.


4 Réponses :


14
votes

Vous devez utiliser une requête SQL paramétrée: xxx

voir les docs pour sqlcommand.parameters pour plus d'informations.

En gros, vous ne devez pas intégrer vos valeurs dans le SQL lui-même pour diverses raisons: < / p>

  • Il est inélégant de mélanger le code et les données
  • Il vous ouvre jusqu'à des attaques d'injection SQL à moins que vous ne très attention à l'échappement
  • Vous devez vous soucier de la mise en forme et des détails i18n pour des choses comme des chiffres, des dates et des horaires, etc.
  • Lorsque la requête reste la même avec seulement les valeurs changeant, l'optimiseur a moins de travail à faire - il peut rechercher la précédente requête optimisée directement car ce sera une correspondance parfaite en termes de SQL.

1 commentaires

J'ai tiré dans la viande de votre réponse à la mienne depuis que le mien a été accepté, au moins une personne qui regarde la réponse acceptée verra la pleine information.



2
votes

Le plus facile est d'utiliser un SQL préparé C #. exemple sur ce message . Vous n'avez pas à vous soucier d'échapper aux caractères de votre chaîne SQL ou de quoi que ce soit


0 commentaires

23
votes

Vous pouvez simplement faire ce xxx

mais c'est mauvais et vous ouvre à l'injection SQL

Vous devez simplement utiliser une requête paramétrée

Quelque chose comme ça devrait vous aider à démarrer xxx

de la réponse de Jon Skeet puisque son était plus complète que la mienne

Voir les docs pour SQLCOMMAND.PARAMETERS Pour plus d'informations.

En gros, vous ne devez pas intégrer vos valeurs dans le SQL lui-même pour diverses raisons:

  • Il est inélégant de mélanger le code et les données
  • Il vous ouvre jusqu'à l'injection SQL Attaques à moins que vous soyez très prudent de s'échapper
  • Vous devez vous inquiéter de la mise en forme et des détails i18n pour des éléments comme des chiffres, des dates et Times etc
  • lorsque la requête reste la même avec seulement les valeurs changer, l'optimiseur a moins de travail à faire - il peut rechercher la requête optimisée précédente directement car ce sera un match parfait dans termes du SQL.

2 commentaires

Et si j'ai une variable multiple, je dois ajouter?


Utilisez plusieurs paramètres. Ressemblerait à quelque chose comme cmd.commandtext = "Sélectionnez * à partir de la table où TILE = @title, chose = @Thing cmd.parameters.add (" @ Titre ", quelqu'un); CMD.Parameters .Ajouter ("@ chose, chose);



1
votes
declare @SqlQuery varchar(2000), @Fromdate varchar(20), @Todate varchar(20)

set @Fromdate='01 jan 2017'
set @Todate='30 mar 2017'


set @SqlQuery='select * from tblEmployee where tblEmployee.JDate between '''+ @Fromdate + ''' and '''+ @Todate+ ''''

print  @SqlQuery

0 commentaires