我搜索了谷歌,但尚未找到解决我问题的方法。基本上我有一个在图库中设置的评论Feed(类似于facebook或stackoverflow评论)。用户可以发表评论并阅读其他用户发布的评论。这工作正常。但是,如果用户尝试使用撇号发布评论,我会得到一个不错的小型Web应用程序错误:
'附近的语法不正确。字符后面有未闭合的引号 字符串')'。
我发布到SQL的评论是 81 。我想要一个能够逃脱所有特殊字符的解决方案无论用户输入什么,无论什么,都不会出错。
代码背后
Fetcher.postUserComments(connectionString, imagePath, comments.ToString(), userId);
提取程序
sqlCom.CommandText = "INSERT INTO dbo.Table(userId, imagePath, userComments, dateCommented) VALUES ('" + userId + "', '" + imagePath + "', '" + comments + "', '" + theDate + "')";
数据类型是字符串,我也尝试过.ToString()
,但没有运气。提前感谢任何有用的输入。
答案 0 :(得分:9)
您应始终使用参数化查询。它们可以帮助您避免像您所拥有的那样,以及SQL Injection attacks
sqlCom.CommandText = "INSERT INTO dbo.Table(userId, imagePath, userComments, dateCommented) VALUES (@userId, @imagePath, @userComments, @dateCommented)";
sqlCom.Parameters.AddWithValue("@userId", userId);
sqlCom.Parameters.AddWithValue("@imagePath", imagePath);
sqlCom.Parameters.AddWithValue("@userComments", comments);
sqlCom.Parameters.AddWithValue("@dateCommented", theDate);
答案 1 :(得分:4)
您需要复制评论中的'字符
comments = comments.Replace("'", "''");
或者,但更安全,是使用Sql参数,例如:
cmd.CommandText = "SELECT * FROM Client, Project WHERE Client.ClientName = @ClientName AND Project.ProjectName = @ProjectName";
cmd.Parameters.Add(new SqlParameter("@ClientName",client.SelectedValue));
cmd.Parameters.Add(new SqlParameter("@ProjectName",projnametxt.Text));
答案 2 :(得分:3)
你永远不应该这样做...因为它允许轻松的SQL注入。我可以通过评论注入恶意的SQL查询,比如......
;drop database master;
使用参数来避免sql注入
command.Parameters.Add(new SqlParameter("@Param", value));