您的位置:首页 > 编程学习 > ASP.NET > 正文

ASP.NET参数化查询

更多 时间:2014-4-4 类别:编程学习 浏览量:1296

ASP.NET参数化查询

ASP.NET参数化查询

一、参数化查询原理

 

在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成 SQL指令的编译后,才套用参数运行,因此就算参数中含有恶意的指令,由于已经编译完成,就不会被数据库所运行。

有部份的开发人员可能会认为使用参数化查询,会让程序更不好维护,或者在实现部份功能上会非常不便,然而,使用参数化查询造成的额外开发成本,通常都远低于因为SQL注入攻击漏洞被发现而遭受攻击,所造成的重大损失。

参数化查询的关键是查询优化器将创建一个可以重用的缓存计划。通过自动地或编程使用参数化查询,SQL Server可以优化类似T-SQL语句的处理。这个优化消除了对使用高贵资源为这些类似T-SQL语句的每一次执行创建一个缓存计划的需求。而且通过创建一个可重用计划,SQL Server还减少了存放过程缓存中类似的执行计划所需的内存使用。

 

 

二、ASP.NET参数化查询实例

  •  
  • C# 代码   复制
  • 
    //连接数据库时,需要添加必须的命名空间
     
    using System.Data;
     
    using System.Data.SqlClient;
     
    //代码
     
    string connectString = @"Data Source=l47\\sqlexpress;Initial Catalog=TestDB;Integrated Security=True";
     
    SqlConnection scon = new SqlConnection(connectString);
     
    scon.Open
     
    SqlCommand selectCmd = new SqlCommand();
     
    selectCmd.CommandText = "select * from student where 学号=@sn";
     
    selectCmd.Parameters.Add("@sn", SqlDbType.Char, 10);//sql指令中存在一个参数,叫@sn,它的类型是字符型,字节长度是10个
     
    selectCmd.Parameters["@sn"].Value = "123456";
     
    selectCmd.Connection = scon;
     
    SqlDataAdapter sda = new SqlDataAdapter();
     
    sda.SelectCommand = selectCmd;
     
    DataSet ds = new DataSet();
     
    sda.Fill(ds, "student");
    
    
    		
  •  

    三、参数化查询意义及注意点

     

    1.可以防止SQL注入

    2.可以提高查询性能(主要是可以复用查询计划),这点在数据量较大时尤为重要

    3.参数化查询参数类型为可变长度时(varchar,nvarchar,char等)请指定参数类型及长度,若为值类型(int,bigint,decimal,datetime等)则仅指定参数类型即可

     

    4.传值为varchar(max)或者nvarchar(max)时,参数长度指定为-1即可

    5.看到有些童鞋对于存储过程是否要指定参数长度有些疑惑,这里补充下,若调用的是存储过程时,参数无需指定长度,如果指定了也会忽略,以存储过程中定义的长度为准,不会因为没有指定参数长度而导致重新编译,不过还是建议大家即便时调用存储过程时也加上长度,保持良好的变成习惯

     

    6、因为参数化查询可以重用执行计划,并且如果重用执行计划的话,SQL所要表达的语义就不会变化,所以就可以防止SQL注入,如果不能重用执行计划,就有可能出现SQL注入,存储过程也是一样的道理,因为可以重用执行计划。

     

     

    标签:参数化查询