2017-07-29 4 views
0

J'essaie d'insérer des informations dans une base de données MS Access. Dans ma base de données que j'ai les colonnes et les types suivants:Erreur de syntaxe dans l'instruction INSERT INTO

log_order - Autonumber (I need this to keep the order where inserted in the db), 
userID - Text, 
time - Text, 
date_ - text, 
message - Text. 

Ma requête:

command.CommandText = "INSERT INTO logs(userID, time, date_, message) VALUES ('"+verifiedUser+"', '"+msg_time+"', '"+msg_date+"', '"+msg+"')";   

OleDbDataReader reader = command.ExecuteReader(); 

L'erreur que je reçois:

System.Data.OleDb.OleDbException: ' Erreur de syntaxe dans l'instruction INSERT INTO. '

J'ai essayé plusieurs messages mais aucun poste ne m'a aidé. Je crois qu'il pourrait y avoir un problème avec la colonne autonumber(). À cause de ce dont je me souviens, je n'ai pas besoin de l'inclure dans la requête. PS: Je sais que je dois transmettre les valeurs en tant que paramètres.

Nous vous remercions à l'avance

+0

Essayez votre requête directement dans Access et voyez quelles erreurs vous obtenez. Je suppose que peut-être avoir des citations autour de verifyUser pourrait causer un problème, si c'est en fait un champ numérique. – PhillipXT

+0

@marc_s s'il vous plaît ne le faites pas .. Je me rends compte que de nombreux utilisateurs viennent à SO pour la solution rapide de leur solution de la merde, mais parfois ils ont vraiment besoin d'être dit de le démarrer correctement.Vous ne savez jamais qui pourrait écrire une solution de commerce électronique qu'un jour va stocker votre numéro de carte de crédit;) –

Répondre

2

Probablement une de vos variables (msg?) Contient une apostrophe

La façon dont vous avez écrit votre SQL est un risque de sécurité énorme. Veuillez immédiatement rechercher des "requêtes paramétrées" et ne jamais, jamais, jamais écrire un sql comme ceci (où vous utilisez la concaténation de chaîne pour virer les valeurs dans la requête). Votre code a une prolifération de problèmes et l'utilisation de requêtes paramétrées les résoudra tous; ils ne sont pas difficiles à écrire

enter image description here

+0

Merci pour le conseil. Mais la variable msg n'est pas l'erreur. – kdem

+4

Tout ce sql est l'erreur .. –

0

Il semble que vos données dans certaines des variables passées dans INSERT peuvent être à l'origine de cette erreur. Essayez de déboguer la valeur dans command.CommandText avant de l'exécuter. Si l'une des variables ont une seule citation, il faudra faire ... Ref: How do I escape a single quote in SQL Server?

brosse également sur Ref Injection SQL: SQL Injection

0

Je suis totalement d'accord avec tout ce qui a été dit, mais répondez directement à votre question, je suis certain que vous devrez mettre des crochets autour de vos noms de champs. OleDb a tendance à ne pas aimer les caractères spéciaux et pourrait bien avoir un problème avec par exemple date_; envoyer [date_] à la place devrait contourner le problème. Il ne va pas aimer le temps non plus. La même solution

Addendum sur l'injection SQL

En aparté, en fait appeler Accès par OleDb est relativement protégé de l'injection SQL. Cela est dû au fait que toute tentative d'exécution de plusieurs instructions dans une commande échoue. (Vous obtenez une erreur de chaîne formatée incorrecte). Donc, alors que vous pourriez soutenir que ce que vous faites est sûr, ce n'est pas pour d'autres fournisseurs de DB. Plus tôt vous adopterez de bonnes habitudes, moins vous risquez d'introduire une vulnérabilité dans un cas où cela pourrait être dangereux. S'il semble que vous subissez des abus, c'est simplement parce que tout le monde ici veut protéger le filet.

+0

Cela a résolu, merci beaucoup! – kdem