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 UserName=@username and PassWord=@password";
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.AddRange(p);
12 
13                 SqlDataReader read = cmd.ExecuteReader();        

 

  •        参数数据类型

   可以设置SqlParameters对象的SqlDbType属性,以控制在向SQL Server数据库中传递参数信息时所使用的数据类型,即SqlDbType枚举中的值。

       SqlDbType的枚举值有:Int,DateTime,Bit,Money,Image,NVarChar等,在下面的示例中,NVarChar对应的是.NET中的string类型。size(即15)代表字符串的长度,可根据需要设置size的值。       

 

1                 SqlParameter p;
2 p = new qlParameter("@username",SqlDbType.NVarChar,15);
3 p.Value = "zyb12345";

 

 

  •        参数方向

        在本例中Sqlparameters是输入参数,有时需要输出参数,这时就要设置SqlParameter的参数方向了。此时不需要设置Value属性。代码如下:

 

1                 SqlParameter w;
2 
3                 w = cmd.Parameters.Add("@username", SqlDbType.NVarChar);
4 
5                 w.Direction = ParameterDirection.Output;                         //设置参数方向
6 
7                 cmd.ExecuteNonQuery();                                           //执行语句
8 
9                 Console.Write(w.Value);                             //获取输出值(执行完数据查询后才能获取Value值)

 

    

 

    

 

    

    

posted @ 2014-09-06 23:01  荣码一生  阅读(3651)  评论(0编辑  收藏  举报