带参数的SqlCommand

我使用以下代码从SQL Server表中进行选择:

using (SqlConnection con = new SqlConnection(SqlConnectionString)) { string sql = @"SELECT * FROM movies WHERE title like '%' + '" + searchQuery + "' + '%'"; using (var command = new SqlCommand(sql, con)) { con.Open(); using (var reader = command.ExecuteReader()) { while (reader.Read()) { .... } } } } 

它工作得很好,但我想阻止SQL注入,所以我尝试使用:

 using (SqlConnection con = new SqlConnection(SqlConnectionString)) { string sql = @"SELECT * FROM movies WHERE title like '%' '@Search' + '%'"; using (var command = new SqlCommand(sql, con)) { command.Parameters.AddWithValue("@Search", searchQuery); con.Open(); using (var reader = command.ExecuteReader()) { while (reader.Read()) { .......... } } } } 

当我尝试执行此操作时,我得不到SQL Server的结果。

知道为什么吗?

“为什么?” 是因为很少有电影在他们的名字中加上“@Search”这个词 – 即“印第安纳琼斯和最后的@Search”。 也许是“星际迷航III:@Search for Spock”​​。 通过将其括在单引号中,您将查找文字字符串@Search ,而不是名为@Search的参数值

 string sql = @"SELECT * FROM movies WHERE title like '%' + @Search + '%'"; 

或者(最好是IMO):

 string sql = @"SELECT * FROM movies WHERE title like @Search"; 

并在呼叫站点添加%

 command.Parameters.AddWithValue("Search", "%" + searchQuery + "%"); 

试试这个:

 using (SqlConnection con = new SqlConnection(SqlConnectionString)) { string sql = @"SELECT * FROM movies WHERE title like '%' + @Search + '%'"; using (var command = new SqlCommand(sql, con)) { command.Parameters.AddWithValue("@Search", searchQuery); con.Open(); using (var reader = command.ExecuteReader()) { while (reader.Read()) { } } } } 

我更改了字符串sql ,我认为它可以帮助。

不要使用单引号’@Search’,因为它在这里像变量一样工作。