ADO.NET基础琐碎总结-----参数化查询
来源:互联网 发布:淘宝商城网店怎么开 编辑:程序博客网 时间:2024/05/22 05:22
参数化查询(Parameterized Query )是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,这个方法目前已被视为最有效可预防SQL注入攻击 (SQL Injection) 的攻击手法的防御方式。下面将重点总结下Parameter构建的几种常用方法。
说起参数化查询当然最主要的就是如何构造所谓的参数:比如,我们登陆时需要密码和用户名,一般我们会这样写sql语句,Select * from Login where username= @Username and password = @Password,为了防止sql注入,我们该如何构建@Username和@Password两个参数呢,下面提供六种(其实大部分原理都是一样,只不过代码表现形式不一样,以此仅作对比,方便使用)构建参数的方法,根据不同的情况选用合适的方法即可:
说明:以下loginId和loginPwd是户登陆时输入登陆用户名和密码,DB.conn是数据库连接,用时引入using System.Data.SqlClient命名空间
方法一:
SqlCommand command = new SqlCommand(sqlStr, DB.conn);
command.Parameters.Add("@Username", SqlDbType.VarChar);
command.Parameters.Add("@Pasword", SqlDbType.VarChar);
command.Parameters["@Username"].Value = loginId;
command.Parameters["@Pasword"].Value = loginPwd;
方法二:
SqlCommand command = new SqlCommand();
command.Connection = DB.conn;
command.CommandText = sqlStr;
command.Parameters.Add(new SqlParameter("@Username", loginId));
command.Parameters.Add(new SqlParameter("@Pasword", loginPwd));
方法三:
Sqlcommand cmd=new Sqlcommand(sqlStr, DB.conn);
cmd.parameters.add("@Username",DbType.varchar).value=loginId;
cmd.parameters.add("@Pasword",DbType.varchar).value=loginPwd;
方法四:
Sqlcommand cmd=new Sqlcommand(sqlStr, DB.conn);
cmd.parameters.addwithvalue("@Username",loginId);
cmd.parameters.addwithvalue("@Pasword",loginPwd);
方法五:
Sqlcommand cmd=new Sqlcommand(sqlStr, DB.conn);
SqlParameter para1=new SqlParameter("@Username",SqlDbType.VarChar,16);
para1.Value=loginId;
cmd.Parameters.Add(para1);
SqlParameter para2=new SqlParameter("@Pasword",SqlDbType.VarChar,16);
para2.Value=loginPwd;
cmd.Parameters.Add(para2);
方法六:
SqlParameter[] parms = new SqlParameter[]
{
new SqlParameter("@Username", SqlDbType.NVarChar,20),
new SqlParameter("@Pasword", SqlDbType.NVarChar,20),
};
SqlCommand cmd = new SqlCommand(sqlStr, DB.conn);
// 依次给参数赋值
parms[0].Value = loginId;
parms[1].Value = loginPwd;
//将参数添加到SqlCommand命令中
foreach (SqlParameter parm in parms)
{
cmd.Parameters.Add(parm);
}
后记:鉴于园友对 dedeyi,鬼火飘荡 ,guihwu 的疑问,我在写一个说明。六种方法其实我想大家都明白微软的底层都是一样的有兴趣的可以反编译一下,只是写法和实现方法的不同,也可以说是语法糖,但是每个人都会选择一个自己想用的,我就随便总结了下。下面具体在把这些方法做个简要说明。方法一和方法二都是用SqlCommand的parameters属性的add方法,add方法里面有七个构造函数,其实方法二就是用的第一个构造函数,至于为什么没写类型是因为有以object为参数的构造函数,当然还有其他的构造函数可以用,可以加入类型参数、指定长度等,我仅仅是说下形式,具体的msdn说的非常清楚。方法三和方法一完全一样仅仅形式不同。至于方法四那就不同了:在.Net Framework 2.0中SqlClient增加了AddWithValue(string parameterName, object value)方法。 该方法简化了调用储存过程的输入参数过程,在运行时对所输入的数据类型进行判断,获取对应的数据库类型。因此该方法在运行效率上比用 Add(string parameterName, SqlDbType sqlDbType, int size, string sourceColumn)方法要低。在效率要求较高的地方仍然建议使用Add()方法,其它场合可以使用AddWithValue()简化代码编写量。方法五和方法二也是一样的,方法五只是分开写了。方法六用了c#3.0的特性——集合初始化器,代码也很清晰,原理同上,不再赘述。
-----------------------------------------------------------------------------------------------------------------------------------------------
作者:GavinDream(GavinDream主页 博客园)
出处:http://www.cnblogs.com/fuchongjundream/
任何转载必须保留完整文章,在显要地方显示署名以及原文链接。如您有任何疑问或者授权方面的协商,请发邮件给我 或者 留言。
- ADO.NET基础琐碎总结-----参数化查询
- ADO.NET基础琐碎总结-----参数化查询
- ADO.NET基础琐碎总结-----参数化查询(有修改)
- ado.net参数化查询
- 【ADO.NET】基础总结
- C# ADO.NET参数查询
- 在ADO.NET中用参数化查询缩短开发时间
- 在ADO.NET中用参数化查询缩短开发时间
- 在ADO.NET中用参数化查询缩短开发时间
- 在ADO.NET中用参数化查询缩短开发时间
- 【Ado.Net】Sql注入和参数化查询
- ADO.NET基础知识点总结
- 【Ado.Net】SQLHelper+配置文件+参数查询
- 【C#基础】【ADO.NET】复习、总结
- 黑马程序员-Ado.net学习之参数化查询(防止sql注入)
- ADO.NET中应用大数据量参数化查询的效率分析
- ADO中怎么使用参数化查询
- 黑马程序员-004ADO.NET的琐碎知识
- 墨菲定律、二八法则、马太效应、手表定理、“不值得”定律、彼得原理、零和游戏、华盛顿合作规律、酒与污水定律、水桶定律、蘑菇管理原理、钱的问题、奥卡姆剃刀等13条是左右人生的金科玉律
- Asp.Net MVC2 实用入门系列:第二篇:第一个页面
- 下载的java package如何导入eclipse
- CImage 访问像素点 像素数据操作
- treeview 树形结构的经典解说
- ADO.NET基础琐碎总结-----参数化查询
- Asp.Net MVC2 实用入门系列:第三篇:ASP.NET MVC全局观
- linux中运行脚本与设置环境变量
- c++中的补零
- LeetCode: Reverse Linked List II
- 在柱状图中找最大矩形——O(n)时间复杂度java实现
- Asp.Net MVC2 实用入门系列:第四篇:传递表单数据
- realloc 的用法
- 新浪微博登录密码加密函数 wsse加密算法说明