使用参数化查询的情景有很多,但最常用的情景是需要用户在查询中进行输入的情况。
有两种方法可供使用。第一,可以讲用户输入嵌入到查询字符串中,例如可能使用.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