ADO.NET基础琐碎总结-----参数化查询

 参数化查询(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/
任何转载必须保留完整文章,在显要地方显示署名以及原文链接。如您有任何疑问或者授权方面的协商,请发邮件给我 或者 留言

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值