首页 > 解决方案 > SQLParameterCollection AddWithValue 和 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; 

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

问题:

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

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

标签: c#sql-server

解决方案


AddAddWithValue不会自动转义任何符号,为了清除或转义用户可能传入的符号,您需要实现类似这样的东西

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

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

推荐阅读