ADO.NET 参数化查询

  使用参数化查询的情景有很多,但最常用的情景是需要用户在查询中进行输入的情况。  

  

  有两种方法可供使用。第一,可以讲用户输入嵌入到查询字符串中,例如可能使用.NET Framework中的String.Format函数。

  

  第二种方法是构造一种参数化查询。

       在开始时执行如下所示的基本查询:  

  

1        select count(*) from UserInfo
2   
3
4      where UserName=‘{0}’ and PassWord=‘{1}’

  

       然后利用用户的输入构造如下查询:

1        select count(*) from UserInfo
2   
3
4      where UserName=‘myUserName’ and PassWord=‘myPassWord’’

    如果对正在执行的查询有一些了解,输入如下内容:NonUser‘ or 1=1 --,那么代码就会执行如下查询。

1        select count(*) from UserInfo
2   
3
4      where UserName=‘NonUser‘ or 1=1 --" and PassWord=‘myPassWord’’

  

    双连字符在SQL Server的查询语法中特别重要。它表示:该行后面的内容是注释。换句话说,and PassWord=‘myPassWord’被忽略了。

    现在,UserName=‘NonUser‘并不成立,但where子句的另一半(1=1)对于所有行均成立。因此,该查询将成功执行。

 1        SqlConnectionStringBuilder connstr = new SqlConnectionStringBuilder();
 2
 3             connstr.DataSource = "ZHANG-PC";
 4
 5             connstr.InitialCatalog = "sq";
 6
 7             connstr.IntegratedSecurity = true;
 8
 9             using (SqlConnection conn = new SqlConnection(connstr.ConnectionString))
10             {
11
12                 conn.Open();
13
14                 SqlCommand cmd = new SqlCommand();
15
16                 cmd.CommandText = "select count(*) from UserInfo where [email protected] and [email protected]";
17
18                 cmd.Parameters.AddWithValue("@username","zyb12345");
19
20                 cmd.Parameters.AddWithValue("@password","654321");
21
22                 cmd.Connection = conn;
23
24                 SqlDataReader read = cmd.ExecuteReader();
25
26                 while (read.Read())
27                 {
28
29                     Console.WriteLine("userName:{0}", read.GetString(0));
30
31                 }
32
33                 conn.Close();
34
35             }

   

 在ADO.NET中执行一个参数化查询,需要向Command对象的Parameters集合中添加Parameters对象。生成Parameters最简单的方法是:

  

调用SqlCommand对象的Parameters集合的AddWithValue函数。

1      SqlCommand的Parameters集合中的AddWithValue方法。
2
3       cmd.Parameters.AddWithValue("@username","zyb12345");
4
5       cmd.Parameters.AddWithValue("@password","654321");

  

  或者

   

 1                 SqlParameter[] p = new SqlParameter[2];
 2
 3                 p[0].ParameterName = "@username";
 4
 5                 p[0].Value = "zyb12345";
 6
 7                 p[1].ParameterName = "@password";
 8
 9                 p[1].Value = "654321";
10
11                 cmd.Parameters.Add(p);
12
13                 SqlDataReader read = cmd.ExecuteReader();        

    

    

    

    

时间: 2024-10-29 19:08:25

ADO.NET 参数化查询的相关文章

关于ADO.NET参数化查询的提问

最近我们的正式环境一直在报错一个异常,首先我贴出来异常信息 BLL层 捕获到了请求的url Net.BLL.MobileFun MobileFun.GetBusinessBidPolicy 异常 传入参数为:AucId=643129;CarId=680362;businessid:41773: 异常信息为:必须声明标量变量 "@UID". 必须声明标量变量 "@UID". 必须声明标量变量 "@UID". URL:http://*********

参数化查询

参数化查询(Parameterized Query 或 Parameterized Statement)是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,这个方法目前已被视为最有效可预防SQL注入攻击 (SQL Injection) 的攻击手法的防御方式. 原理: 在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成 SQL 指令的编译后,才套用参数运行,因此就算参数中含有恶意的指令,由于已经

SQL参数化查询

参数化查询(Parameterized Query 或 Parameterized Statement)是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,这个方法目前已被视为最有效可预防SQL注入攻击 (SQL Injection) 的攻击手法的防御方式. 原理 在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成 SQL 指令的编译后,才套用参数运行,因此就算参数中含有恶意的指令,由于已经编

参数化查询比拼接字符串慢的原因

我们都知道,参数化查询可以处理SQL注入,以及提高查询的效率,因为参数化查询会使MSSQL缓存查询的计划. 但是现在我发现一个奇怪的问题,就是参数化查询比字符串拼接要慢,而且速度相差10倍之多. SQL语句是: select * from T_Message where T_Message.BelongTo=@BelongTo 开始在ADO.NET中用SqlParameter传递参数@BelongTo时是这么写的 SqlParameter param1 = new SqlParameter("@

为什么参数化查询可以防止SQL注入?(转)

昨天被某大牛问了一个问题,为什么SQL参数化查询可以防止SQL注入,参数化查询的原理是什么? 结果闷逼了,之前只知道参数化查询是可以防止SQL注入,但是没有深究其原理,今天就找一些文章,学习一下,也分享给大家. 以下引用知乎大神们的回答: 原理是采用了预编译的方法,先将SQL语句中可被客户端控制的参数集进行编译,生成对应的临时变量集,再使用对应的设置方法,为临时变量集里面的元素进行赋值,赋值函数setString(),会对传入的参数进行强制类型检查和安全检查,所以就避免了SQL注入的产生. 最近

Sql Server参数化查询之where in和like实现详解

来自:http://www.cnblogs.com/lzrabbit/archive/2012/04/22/2465313.html#wherein 文章导读 拼SQL实现where in查询 使用CHARINDEX或like实现where in 参数化 使用exec动态执行SQl实现where in 参数化 为每一个参数生成一个参数实现where in 参数化 使用临时表实现where in 参数化 like参数化查询 xml和DataTable传参  身为一名小小的程序猿,在日常开发中不可以

使用dapper进行参数化查询

在使用Dapper操作Mysql数据库中我介绍了使用dapper进行CURD基本操作,但在示例代码中参数虽然也是通过@开头,但其实不是真正意义的参数化查询,而是拼接sql,这种方式不利于防止sql注入,所以在Dappe中可以使用DynamicParameters动态参数集合添加参数,从而实现dapper下的参数化查询: 示例代码 using (var connection = new MySqlConnection(connstr)) { //声明动态参数 DynamicParameters P

.NET 出现参数化查询 需要参数但未提供该参数的错误

1.问题的来源 在.NET或者C#中,我们一般执行sql语句的话,推荐使用参数化查询,这样可以避免sql注入的攻击,但是,我在使用参数化查询的时候 出现了以下的错误,详细如下图: 图一这是写sql语句参数化查询的代码 图2 这是MSSQL执行的sql语句 2.问题的原因   出现这种错误的原因在于,在参数化查询的时候,有几个参数的值为null,这样的话,就出现了如图2所示的错误. 为啥会这样了?? 虽然参数的值就是为null,传入数据库中就必须变成DbNull.Value因为此null为c#的,

参数化查询为什么能够防止SQL注入

很多人都知道SQL注入,也知道SQL参数化查询可以防止SQL注入,可为什么能防止注入却并不是很多人都知道的. 本文主要讲述的是这个问题,也许你在部分文章中看到过这块内容,当然了看看也无妨. 首先:我们要了解SQL收到一个指令后所做的事情: 具体细节可以查看文章:Sql Server 编译.重编译与执行计划重用原理 在这里,我简单的表示为: 收到指令 -> 编译SQL生成执行计划 ->选择执行计划 ->执行执行计划. 具体可能有点不一样,但大致的步骤如上所示. 接着我们来分析为什么拼接SQ