单引号在SQL Server查询中转义 - 使用参数化值

时间:2013-09-27 09:17:10

标签: c# sql sql-server

下面是我修剪过的C#:

thisConnection.Open();
string commandtext = "Insert into Table (Comments)values('@Comments')";
SqlCommand command = new SqlCommand(commandtext, thisConnection);
command.Parameters.Add("@Comments", SqlDbType.VarChar).Value = Comments;
command.ExecuteNonQuery();
thisConnection.Close();

我几乎可以输入任何东西,在输入数据库之前会删除某些特殊字符,这对我很好,即使只是一个单引号也会在工作中抛出一个扳手。我尝试将.Replace("'","''");添加到Comments变量,但这并没有改变任何内容,我使用参数应该可以防止这种情况发生。

我知道这样的问题已被问到很多,但到处都只是指向“使用参数!”


编辑:看到有四个人说了同样的话,我在这里回答这一切。 我删除了@Comments周围的单引号,但问题完全相同。任何带单引号的输入都不会输入数据库。

我在使用javascript之前添加了.replace(/'/g,"''"),这是有效的,但我不知道为什么我应该这样做。

5 个答案:

答案 0 :(得分:2)

您不需要单引号。

command.CommandText = "Insert into Table (Comments)values(@Comments)";

好的,在hvd的评论之后阅读一下,我看到它的工作方式是执行sp_executesql

解决这个问题的方法可能如下:

thisConnection.Open();
SqlCommand command = new SqlCommand(commandtext, thisConnection);
command.CommandText = "Insert into Table (Comments)values(@Comments)";
SqlParameter param  = new SqlParameter();
param.ParameterName = "@Comments";
param.Value         = Comments;
command.Parameters.Add(param);
command.ExecuteNonQuery();
thisConnection.Close();

答案 1 :(得分:0)

应如图所示:

cmd.CommandText = "INSERT INTO Table (Comments) VALUES(@Comments)"

答案 2 :(得分:0)

使用参数时,不必转义单引号。
假设CommentsString类型,那么就这样做:

command.CommandText = "Insert into Table (Comments)values(@Comments)";
command.Parameters.Add("@Comments", SqlDbType.VarChar).Value = Comments;

答案 3 :(得分:0)

"Insert into Table (Comments)values('@Comments')";

应该是

"Insert into Table (Comments)values(@Comments)"; <-- no single quotes

人们建议您使用parameters的原因是为了避免SQL injection。看看Bobby Tables

答案 4 :(得分:0)

我已经尝试过类似的方法,但没有遇到任何异常,但对于SQL注入来说可能并不安全。

Comments.Replace("'", $"{(char)39}");