Sql Server 的参数化查询
为什么要使用参数化查询呢?参数化查询写起来看起来都麻烦,还不如用拼接sql语句来的方便快捷。当然,拼接sql语句执行查询虽然看起来方便简洁,其实不然。远没有参数化查询来的安全和快捷。
今天刚好了解了一下关于Sql Server 参数化查询和拼接sql语句来执行查询的一点区别。
参数化查询与拼接sql语句查询相比主要有两点好处:
1、防止sql注入
2、 提高性能(复用查询计划)
首先我们来谈下参数化查询是如何防止sql注入的这个问题吧。
防注入例子:
拼接sql语句:
("select * from user where name={0}",username) 或者 ("select * from user where name="+username)
当 name传进来是一个’aa’;Truncate Table user 的时候,这样会导致直接清除整个表数据
"select * from user where name='aa';Truncate Table user
我们使用参数化的时候:
("select * from user where name=@username",new {username=username})
这时候即使我们传进来的是‘aa’;Truncate Table user ,数据库端也会把这些当做字符串处理,执行的sql语句会变成
select * from user where name=''aa';Truncate Table user '
实际上把‘aa’;Truncate Table user 这个当做了name的值做查询条件了
以上就是一个简单的例子介绍关于参数化查询如何防止sql注入。
再看到底是如何提高性能的呢?
复用查询计划:
select * from AU_User where Id=1 select * from AU_User where Id=2
Sql Server在执行一条查询语句之前都对对它进行“编译 ”并生成“查询计划”,上面两条查询语句生成的查询计划就是两条不一样的查询计划,在下面这张图片当中我们可以去尝试下执行这两条sql语句
,结果显而易见会生成两条查询计划,Id后面所接的参数不一致。
然后我们再来看看使用参数化查询
select * from AU_User where Id=@Id
这样不管你传的参数是多少,执行编译生成的查询计划都是 select * from AU_User where Id=@Id,这样可以实现查询计划的复用,并不需要同一个查询去生成多个查询计划
完全可以节省其中生成查询计划的时间
欢迎大家扫描下方二维码,和我一起学习更多的知识😊
原文地址:https://www.cnblogs.com/hulizhong/p/10685943.html
相关推荐
-
C# 设置Excel数据自适应行高、列宽的2种情况 C#
2019-4-19
-
浅谈surging服务引擎中的rabbitmq组件和容器化部署 C#
2019-7-3
-
C# 填充Excel图表、图例背景色 C#
2019-4-19
-
献身说法—修复bug时的一些小技巧 C#
2019-6-20
-
在Bootstrap开发中解决Tab标签页切换图表显示问题 C#
2019-5-17
-
基于 Roslyn 实现动态编译 C#
2019-8-29
-
.NET Core微服务之服务间的调用方式(REST and RPC) C#
2019-5-10
-
Centos7 防火墙 firewalld 实用操作 C#
2019-4-18
-
.NET Core GC 的设计 C#
2019-6-30
-
Nancy基于JwtBearer认证的使用与实现 C#
2019-5-4