如何处理单引号

时间:2014-01-29 18:32:47

标签: c# sql-server escaping

我有和没有单引号的数据:

saed
sa'ed

我想要两个结果,即用户是否在搜索表单中输入了saedsa'ed

 var lastName = request.LastName.IndexOf("*", 0, StringComparison.InvariantCulture) >= 0
      ? request.LastName.RemovePercentsign().ReplaceAsterikWithPercentSign()
      : request.LastName+ "%";

3 个答案:

答案 0 :(得分:1)

如果您想忽略单引号,请将其删除:

lastName.Trim().Replace("'","")

只需将它交换到您目前所拥有的位置:

lastName.Trim()

e.g:

command.Parameters.Add(new SqlParameter("@LastName", lastName.Trim()));

变为:

command.Parameters.Add(new SqlParameter("@LastName", lastName.Trim().Replace("'",""));

现在,您没有费心显示实际检查表格的代码,但我怀疑您还需要执行以下操作:

WHERE REPLACE(column,'''','') LIKE @LastName + '%';

为了避免通过将此替换函数应用于列来强制扫描整个表,您可以考虑创建一个已删除撇号(并对其进行持久化和/或索引)并检查该列而不是主列的计算列(你想保留撇号,而不是完全删除它们,因为你仍然想要正确地显示数据)。

当然你也可能想要处理一组其他字符,例如如果有人输入Moseley-WilliamsMoseleyWilliams,您是否希望Moseley-WilliamsMoseleyWilliams都回来?智能撇号()怎么样?在搜索过程中,任何人可能在数据输入时间放入的错误字符怎么办?是否要更正Sm"thSm"ith等用户类型?

答案 1 :(得分:1)

如果您更改查询文本以包含SQL函数REPLACE

,则可以尝试实现目标

假设您的命令文本如下

string cmdText = "SELECT * FROM customers WHERE REPLACE(LastName, '''', '') LIKE @lastname";

现在,如果您准备参数@lastname,请删除其值中显示的所有引号,例如Mr Bertrand建议

command.Parameters.Add(new SqlParameter("@lastname", lastName.Trim().Replace("'",""));

您将检索上面测试集中的所有记录。 请注意检查此查询的性能,因为我强烈认为以这种方式使用REPLACE会杀死任何类型的优化器

答案 2 :(得分:-1)

基本上你必须检查单引号是否存在,然后再添加两个并将其插入数据库:

使用lastName.Contains("\'")来chcek并使用lastName.Replace("'","''")

替换它