SQLParameterCollection AddWithValue和Add不会转义通配符

时间:2018-04-25 16:46:01

标签: c# sql-server

我目前正在构建一个API,允许用户使用该名称搜索数据库对象。存储过程按以下方式运行此查询:

ALTER PROCEDURE [GetMyDatabaseObjectByName] 
    @name varchar(255)
as
begin
select mdo.Name,
       mdo.ID
      from MyDatabaseObject mdo
      where mdo.Name like '%' + @name + '%'
end

我从C#应用程序调用此查询,如下所示:

dbCommand.Parameters.AddWithValue("@name", name); 

这一切都很棒,但是如果用户传入'%'符号作为我的QA工程师如此优雅,那么存储过程将返回数据库中的每个元素,因为它将其解释为以下内容:

 select mdo.Name,
        mdo.ID
      from MyDatabaseObject mdo
      where mdo.Name like '%' + '%' + '%'

我尝试过使用

dbCommand.Parameters.Add("@name", SqlDbType.NVarChar).Value = name; 

但我得到了同样的结果。根据文档,我认为添加 AddWithValue 会自动转义字符串以避免这种情况。

问题:

System.Data.SqlClient 中是否有任何内置解决方案可以转义传入的任何符号?

这里首选的方法是什么,在客户端使用正则表达式来避免它传递任何时髦的字符?

1 个答案:

答案 0 :(得分:0)

添加并且 AddWithValue 不会自动转义任何符号,为了清理或转义用户可能传入的符号,您需要实现类似< / p>

name = EscapeForLike(name)
dbCommand.Parameters.AddWithValue("@name", name); 

public static string EscapeForLike(string input)
{
    return input
        .Replace("[", "\\[")
        .Replace("]", "\\]")
        .Replace("\\", "[\\]")
        .Replace("%", "[%]")
        .Replace("_", "[_]");
}