惭愧啊,说好的经常写,结果忘了,不是没写,是写在云笔记中,忘了写出来了,我技术不强,写的只是我遇到的困惑和解决方法。

有错误,看到的人不吝指教,估计也没人看吧!哈哈!


通过我在写毕业设计中模糊查询的问题来引入这个话题吧!

今天遇到一个问题,利用非字符串拼接的方式在毕业设计里面写一个模糊查询,代码如下:

 StringBuilder strSql = new StringBuilder();

 strSql.Append("select EmpId, EmpName, Email, PhoneNumber, PosintionName, DepName from dbo.ViewContactBook  ");

 if (!name.Equals(""))

 {

      strSql.Append("where PosintionName=@PosintionName and DepName=@DepName and EmpName like '%@name%' ");   }

 else

 {

       ………省略………

 }

 SqlParameter[] parameters ={new SqlParameter("@PosintionName", SqlDbType.NVarChar,50),

                                            new SqlParameter("@DepName", SqlDbType.NVarChar,50),

                                       new SqlParameter("@name",SqlDbType.NVarChar,30)};     

parameters[0].Value = positionName;

parameters[1].Value = departName;

parameters[2].Value = name;
 

代码想实现的就是通过部门名称和职位名称对提供的姓名进行模糊查询,但是运行之后发现怎么都不能成功实现,调试了半天,刚以为like我写错了,但是反复在SQL中测试like,发现没错。
当然用字符串拼接的方法做的话,可以完成,但是这样又不安全。
最后通过查资料和测试发现了问题:(假设现在name是CF)
SQL在执行的时候,把参数 @name解析成了 ’CF‘ ,就是说自动给参数添加了一个单引号,所以以上代码的模糊查询部分就成了:
like '%'CF'%' 而我们需要的是 like '%CF%'。
解决方法如下:先修改上面红色的SQL语句然后修改红色的参数语句。


 strSql.Append(" where PosintionName=@PosintionName and DepName=@DepName and EmpName like @name");
 parameters[2].Value = "%"+name+"%";

经过以上处理后 

代码执行的时候,给@name 添加了单引号’@name‘ ,现在的@name=%CF% ,所以like的整个部分就成了 like '%CF%'


上述的发现问题,解决问题,让我得出来一个结论。

如果在SQL语句中,有需要分号的来处理的。那么别在程序的SQL中直接打分号。而是在赋值的时候,进行处理。