在做查询自动完成(Autocomplete)功能时,出现一个小bug。如下图所示:
用微软拼音键入时,会有单引号将拼音间隔开(搜狗不会),当触发前端自动完成代码块时,会调用后台的查询语句,然而......下一秒报错:
这个错误很明显是sql语句语法错误引起的,我这里后端用的是字符串拼接方式生成sql语句,其中部分条件模糊查询语句如下:
sql += string.Format(@" and (Name like '%{0}%' or ShortName like '%{0}%'
or LinkMan like '%{0}%' or TelPhone like '%{0}%' or Mobile like '%{0}%'
or MainBrand like '%{0}%' or PY like '%{0}%'", key);
对应的sql语句:
and Name like '%shang'hai%' or ShortName like '%shang'hai%' or LinkMan like '%shang'hai%'
or TelPhone like '%shang'hai%' or Mobile like '%shang'hai%' or MainBrand like '%shang'hai%'
or PY like '%shang'hai%')
这里就是问题的灶点,当调用SqlQuery()时,数据库服务器肯定是报错的。
下面是该bug解决方案:
利用SqlParameter类,将待查询关键字在sql语句中参数化,以避免单引号sql注入。
var i = 0;
var parameters = new List<SqlParameter>();
sql += string.Format(@" and (Name like @word_{0} or ShortName like @word_{0} or LinkMan like @word_{0}
or TelPhone like @word_{0} or Mobile like @word_{0} or MainBrand like @word_{0} or PY like @word_{0}", i);
parameters.Add(new SqlParameter(string.Format("@word_{0}", i), string.Format("%{0}%", key)));
对应的sql语句:
AND
(
Name LIKE @word_0
OR ShortName LIKE @word_0
OR LinkMan LIKE @word_0
OR TelPhone LIKE @word_0
OR Mobile LIKE @word_0
OR MainBrand LIKE @word_0
OR PY LIKE @word_0
)
关于“@word_0”取值,其实它存在了parameters 中。因此,调用SqlQuery()时要传两个参数,一个“sql”,一个“parameters”数组,那么在数据库服务器会将参数与值对号入座。
PS:如果是多关键字查询,可以遍历它们,然后用i变量每次自增1予以区分。