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

  • 相关阅读:
    java面向对象第六章
    java面向对象第四章
    java面向对象第三章
    java面向对象第二章
    java面向对象第一章
    java基础(9)
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    最小堆解决TOP N问题
    kafka相关
    golang 反射获取参数对应类型原始值
  • 原文地址:https://www.cnblogs.com/fuchongjundream/p/2429747.html
Copyright © 2011-2022 走看看