SqlCommand with Parameters

本文关键字:Parameters with SqlCommand | 更新日期: 2023-09-27 17:53:44

我用下面的代码从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的结果。

知道为什么吗?

SqlCommand with Parameters

"为什么?"是因为很少有电影在他们的名字里有"@Search"这个词。"印第安纳琼斯和最后的搜索"。也许是《星际迷航3:寻找斯波克》。通过将其括在单引号中,您正在寻找字面值字符串@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',因为它在这里就像变量一样。