带参数的 SqlCommand

Posted

技术标签:

【中文标题】带参数的 SqlCommand【英文标题】:SqlCommand with Parameters 【发布时间】:2014-03-26 12:09:14 【问题描述】:

我使用以下代码从 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 获得任何结果。

知道为什么吗?

【问题讨论】:

标题已关闭-您从未在 SqlConnection 上设置参数-以防万一您不知道 SqlConnection 和 SqlCommand 之间存在差异。 【参考方案1】:

“为什么?”是因为很少有电影的名字中有“@Search”这个词——即“Indiana Jones and the Last @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 + "%");

【讨论】:

喜欢互联网:Films with Search in the title - 但是请注意,标题中没有@Search 我认为这真是太可惜了,这表明我们的电影制作人受过多少教育。 @Search for Spock 将是一个比没有 @ 更好的标题。【参考方案2】:

试试这个:

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,我认为它可以提供帮助。

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于带参数的 SqlCommand的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript--关于实例对象带不带参数和构造函数带不带参数的关系

怎样在Delphi中实现在运行中实现带参数的存储过程?

SQL Server 如何执行 带参数的 存储过程

ThreadPool.QueueUserWorkItem的用法,带参数和不带参数

SQL一个带参数的存储过程写法

Java带参数的方法?