tName 运行的时候,直接抛出异常,提示“Anders”附近有语法错误。毫无疑问,它执行的sql语句: UPDATE Person SET FirstName=''Anders'' WHERE Id=10 是不能通过的,同时证明了string.format函数不能有效防止sql注入。 (2)、直接通过linq方法的参数传递,结果如何呢? 改进(1)的传参方法: /// /// 直接执行sql语句 根据用户Id更新FirstName /// /// 用户Id /// 更新后的FirstName /// public int ModifyNameById(int id, string destName) { //string strSql = string.Format("UPDATE Person SET FirstName='{0}' WHERE Id={1}", destName, id);//这么拼接有风险 //int result = dataContext.ExecuteCommand(strSql); string strSql = "UPDATE Person SET FirstName={0} WHERE Id={1}"; int result = dataContext.ExecuteCommand(strSql, new object[] { destName, id }); Console.WriteLine(); Console.WriteLine("affect num:{0}", result); return result; } 再次通过如下的方式调用: int result = ServiceFactory.CreatePersonService().ModifyNameById(10, "'Anders'");//更新id为10的人的FirstName 这一次运行正常吗?经测试,真的真的是真的正常,终于可以长松一口气了。查看数据库,Id为10的那一条记录的FirstName结果改变成了“'Anders'”(带单引号),明白ADO.NET工作原理的都知道这个一点也不神奇,不是吗? 对比(1)和(2),我们发现还是用linq2sql的源生方法传参比较好,通过拼接sql应该尽量避免。 到这里,可能你会认为上面1、2、3全是废话,知道怎么用不就行了嘛?!其实很长一部分时间我也是这么想这么做的。工作久了,早就习惯了不求甚解,现在看书,看园子里高手的博客,多多少少会有点反思。 4、思考 ADO.NET中比较常用的ExecuteScalar方法,在linq2sql应该怎么实现呢?您尝试使用过了吗?
|