我正在尝试在MS Access数据库中插入一些信息。 在我的数据库中,我有以下列和类型:
log_order - Autonumber (I need this to keep the order where inserted in the db),
userID - Text,
time - Text,
date_ - text,
message - Text.
我的查询:
command.CommandText = "INSERT INTO logs(userID, time, date_, message) VALUES ('"+verifiedUser+"', '"+msg_time+"', '"+msg_date+"', '"+msg+"')";
OleDbDataReader reader = command.ExecuteReader();
我得到的错误:
System.Data.OleDb.OleDbException:'INSERT INTO语句中的语法错误。'
我尝试了几个帖子,但没有帖子帮助过我。我相信自动编号列可能存在问题(log_order
)。因为我记得我不必将它包含在查询中。
PS:我知道我必须将值作为参数传递。
提前谢谢
答案 0 :(得分:2)
你的一个变量(msg?)可能包含一个撇号
您编写SQL的方式存在巨大的安全风险。请立即查找“参数化查询”,永远不要再写这样的sql(使用字符串连接将值添加到查询中)。您的代码存在大量问题,使用参数化查询将解决所有问题;他们写起来并不难
答案 1 :(得分:0)
看来你在INSERT中传递的一些变量中的数据可能会导致这个错误。在执行之前尝试调试command.CommandText
中的值。
如果任何变量都有单引号,则必须将其转义...
参考:How do I escape a single quote in SQL Server?
同时了解SQL注入参考:SQL Injection
答案 2 :(得分:0)
我完全赞同所说的一切,但为了直接回答你的问题,我很确定你需要在你的字段名称旁边加上方括号。 OleDb倾向于不喜欢特殊字符,并且很可能遇到问题,例如date_;发送[date_]代替应该解决问题。 它也不会喜欢时间。相同的解决方案
SQL注入附录
顺便说一下,实际上通过OleDb调用Access相对于SQL注入是受到保护的。这是因为在一个命令中执行多个指令的任何尝试都会失败。 (您收到格式错误的字符串错误)。因此,虽然您可能认为您正在做的事情是安全的,但它不适用于其他数据库提供商。您越早养成良好习惯,在可能存在危险的情况下引入漏洞的可能性就越小。如果你似乎得到了一连串的滥用行为,那只是因为这里的每个人都希望保持网络安全。