我使用以下代码从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”一词-即“ Indiana Jones and the Last @Search”。也许是《星际迷航3:@搜索Spock》。通过将其用单引号引起来,您正在查找文字字符串@Search,而不是 称为参数@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 + "%");