sqlParameCollection addWithValue and Add不会逃脱通配符符号



我当前正在构建一个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 中是否有内置的解决方案。

在此处使用REGEX在客户级别中避免传递任何时髦的字符?

是什么?

add addwithvalue 不会自动逃脱任何符号,以清洁或逃脱用户可以传递的符号您需要实现类似的东西

name = EscapeForLike(name)
dbCommand.Parameters.AddWithValue("@name", name); 
public static string EscapeForLike(string input)
{
    return input
        .Replace("[", "\[")
        .Replace("]", "\]")
        .Replace("\", "[\]")
        .Replace("%", "[%]")
        .Replace("_", "[_]");
}

最新更新