通过C#转义SQL INSERT INTO中的特殊字符

时间:2014-06-20 03:46:44

标签: c# sql sql-server escaping

我搜索了谷歌,但尚未找到解决我问题的方法。基本上我有一个在图库中设置的评论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(),但没有运气。提前感谢任何有用的输入。

3 个答案:

答案 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));