我有一个使用名为“name”的参数调用的函数现在它工作正常..直到我用'在其中进行搜索..所以我发送这个作为名称
Plastic & Foam 3'X5' XLT
当我发送它在网站上返回空(没有错误),但如果我发送jusr Plastic & Foam
它工作正常,它回来确定。现在在sql部分,当我通过像这样的管理工作室发送查询时,我得到了这个
exec sp_productSearch 'Plastic & Foam 3''X5'' XLT'
SELECT Name FROM PProducts WHERE NAME LIKE '%Plastic & Foam 3'X5' XLT'
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 'X5'.
在C#中我发送文本列表
Server.HtmlEncode(txtproductname.Text.Trim().Replace("'", "''"))
任何想法我可能做错了什么?
PS:存储过程很简单,就像这样
Select Name from PProducts Where NAME LIKE '%' + @NAME + '%' ;
谢谢。
答案 0 :(得分:3)
您是将'
个字符“raw”传递给SQL中的查询?您遇到了一个名为SQL injection的问题。
请找出将数据“安全”传递到SQL服务器的解决方案。对于C#,您应该查看eg. this question以获得更贴切的提示。
答案 1 :(得分:1)
看起来您已经有一个名为@NAME
所以你的存储过程只需要做
SELECT Name
FROM PProducts
WHERE NAME LIKE '%' + @NAME + '%'
或者,更好的是,如果您的任何产品名称包含%
等模式字符,则根据LIKE
完全不使用SELECT Name
FROM PProducts
WHERE CHARINDEX(@NAME,NAME) > 0
并使用
txtproductname.Text
或者,更好的是,使用全文搜索
我假设您正在构建存储过程中的查询字符串,然后执行它。根据您到目前为止发布的内容,这不是必需的,并且是SQL注入风险。
也不要手动转义{{1}}值。使用参数将其“原样”传递。
答案 2 :(得分:1)
<强> EDITED 强>
你的问题的最后一部分有点可怕
Select Name from PProducts Where NAME LIKE ''%' + @NAME + '%'''
我想知道你为什么使用这么多引号而且你可以通过字符串连接来执行SQL:
EXEC 'Select Name from PProducts Where NAME LIKE ''%' + @NAME + '%'''
如果是这种情况,那么解决它的快速/肮脏的方法是两次转义引号,这意味着:
EXEC sp_productSearch 'Plastic & Foam 3''''X5'''' XLT'
此语句应该没有问题运行,但使用用户输入执行SQL查询是一种非常糟糕的方式。其他答案已经涵盖了。
另一方面,根据this page调用Html Encode,&
变为&
,所以要小心。