我目前正在构建一个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 中是否有任何内置解决方案可以转义传入的任何符号?
这里首选的方法是什么,在客户端使用正则表达式来避免它传递任何时髦的字符?
答案 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("_", "[_]");
}