8
votes

Comment ajouter des citations à une commande SQL dynamique?

Je stocke et je modifie un champ dans une base de données impliquant une longue chaîne d'une ou plusieurs phrases. chaque fois que j'entre un seul devis dans la zone de texte et que vous souhaitez le sauvegarder, il jette une exception comme "Syntaxe incorrecte près de" L ". Marque de citation non clothée après la chaîne de caractères ''. " Y a-t-il une idée d'éviter cela?

EDIT: La requête est la suivante: xxx


5 commentaires

Veuillez afficher la déclaration SQL que vous utilisez.


Il suffit d'échapper à «avec un autre» comme Angels de l'enfer à Angels de l'enfer


Sqlcommand com = nouveau sqlcommand ("Mettre à jour la question de la question = '[" + tbquestion.text + "]' ', réponse =' [" + tbanswer.text + "] '', lèses = '" + actualUser.login + "" Où Id = '"+ couranteQuestion.id +"' ");


C'est ce que nous pensions tous. Veuillez éditer votre question pour ajouter ces informations.


Ne t'inquiète pas. Je le ferai pour toi.


6 Réponses :


3
votes

Écrivez un produit stocké pour effectuer votre modification de champ et utiliser des paramètres SQL pour enregistrer la valeur. Les citations n'auront pas d'importance. Si vous ne souhaitez pas que de la part stockée, créez au moins votre texte SQL avec des marqueurs de paramètres et utilisez des paramètres SQL avec cela.


0 commentaires

8
votes

Si vous souhaitez inclure une seule citation dans un champ SQL, évacuez-le à l'aide de guillemets simples xxx

ceci est pour SQL Server.


3 commentaires

Il serait beaucoup plus sûr d'utiliser le SQL paramétré à la place.


Luke: Bien sûr, mais je ne vais pas rester assis ici et essayer de deviner comment il fait actuellement son SQL, alors je vais donc donner la réponse la plus simple.


@Thetxi: assez juste, mais cependant, il fait son SQL, la seule chose qui est certaine, c'est qu'il n'utilise pas de paramètres. L'utilisation de paramètres éviterait ce problème complètement.



1
votes

Dans MSSQL, vous pouvez doubler vos devis:

my dodg'y test          -> 'my dodg''y test'
my 'quoted' string      -> 'my ''quoted string'''
'first and last quotes' -> '''first and last quotes'''


1 commentaires

mais le problème est que je reçois l'entrée de l'utilisateur de sorte que cela ne serait pas agréable de dire à l'utilisateur d'ajouter une autre citation



2
votes

Il est difficile de vous donner une réponse spécifique, car vous n'écoutez pas la langue de la base de données ou de l'application que vous utilisez.

Vous devez construire votre SQL de manière dynamique et la citation de la piqûre est interprétée comme le fin de la chaîne. Selon la base de données que vous utilisez, vous devez échapper aux guillemets simples de chaque chaîne que vous souhaitez utiliser dans votre commande SQL. Ceci peut être vu en imprimant votre requête avant d'essayer de l'exécuter.

Vous ne mentionnez pas l'application que vous appelez la base de données à partir de, mais lorsque vous construisez votre commande, vous devez utiliser un correctif_quotes () Commande que vous écrivez ou si cela est fourni par votre langue: xxx

Ce type de requête dynamique est très facile pour un Attaque d'injection SQL . Je vous recommanderais d'appeler la base de données avec une procédure stockée ou avec une liste de paramètres.


0 commentaires

11
votes

AS km dit, ne fais pas cela!

faire cette à la place: xxx


0 commentaires

0
votes

Comme certains l'ont déjà dit, l'ajout d'une citation supplémentaire fera l'affaire. Je peux confirmer que c'est également le cas pour Oracle (d'autres ont donné à cette réponse valable pour SMSQL et SQL Server). Je pense que l'utilisation de procédures stockées est surchargée pour cela.


2 commentaires

Que diriez-vous d'utiliser une requête paramétrée?


Oui, tu peux faire ça. La solution de double citation devra être utilisée si vous exécutez directement SQL, non via l'API .NET.