首页 > 代码库 > ADO.NET 参数化查询

ADO.NET 参数化查询

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

  

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

  

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

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

  

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

   

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

 

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

 

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

 

1        select count(*) from UserInfo2   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 = http://www.mamicode.com/"zyb12345"; 6  7                 p[1].ParameterName = "@password"; 8  9                 p[1].Value = http://www.mamicode.com/"654321";10 11                 cmd.Parameters.Add(p);12 13                 SqlDataReader read = cmd.ExecuteReader();        

 

 

 

    

 

    

 

    

    

ADO.NET 参数化查询