我有一张桌子,上面放着产品。我需要进行查询,以找到所有与用户输入值匹配的结果。我正在使用SqlParameter输入的插入。
SqlParameter
SqlCommand findProcutsByPattern = new SqlCommand( "SELECT *" + " FROM [Products]" + " WHERE ProductName LIKE @pattern", connection); findProcutsByPattern.Parameters.AddWithValue("@pattern", '%' + pattern + '%');
当用户输入字符串包含“ _”或“%”时,就会出现问题,因为它们被解释为特殊字符。另一方面,请考虑以下因素:
命令对象使用参数将值传递给SQL语句或存储过程,从而提供类型检查和验证。与命令文本不同,参数输入被视为文字值,而不是可执行代码。
我不应该有这样的问题。我是否需要替换/转义输入字符串中的所有“ _”和“%”,还是有一个更优雅的解决方案?我希望将输入视为文字。
我在表中有一些记录,这些记录的名称中包含特殊字符(N_EW,N \ EW,N%EW,N” EW,N’EW)。将 ** , “ 和 ”** 指定为输入效果很好(考虑它们作为文字)。
您有两种选择:
[
]
where pattern like '[%]'
查找百分比字符。要转义的字符的完整列表- '_', '%', '[', ']'带有相应的替换'[_]', '[%]', '[[]', '[]]'。可以在转义转义符不起作用的示例代码中找到SQLLIKE运算符
'_', '%', '[', ']'
'[_]', '[%]', '[[]', '[]]'
where pattern like '`%' escape '`'
(请参阅MSDN- LIKE(Transact-SQL)上的语法。)
在这两种情况下,我都建议您在应用程序层进行替换,但如果您确实需要,也可以在SQL中进行替换:
where pattern like replace(@pattern, '%', '[%]')
而且,就用户界面而言,向最终用户提供通配符访问权限可能是一件好事。
注:有几个比较特殊的字符'-',并'^'在LIKE查询,但他们并不需要,如果你已经逃离转义'['和']'。
'-'
'^'
'['
']'