带参数的 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--关于实例对象带不带参数和构造函数带不带参数的关系