是什么?
我当前正在构建一个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("_", "[_]");
}