参数化查询(Parameterized Query 或 Parameterized Statement)是访问数据库时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值。
在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中含有指令,也不会被数据库运行。Access、SQL Server、MySQL、SQLite等常用数据库都支持参数化查询。
在ASP程序中使用参数化查询
ASP环境下的参数化查询主要由Connection对象和Command对象完成。
Access数据库只支持匿名参数,在传入参数的位置用问号代替即可。SQL Server数据库虽然支持匿名和非匿名的参数,但是在ASP中也仅能使用匿名参数。
var conn = Server.CreateObject("ADODB.Connection"); conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("Test.mdb"); conn.Open(); var cmd = Server.CreateObject("ADODB.Command"); cmd.ActiveConnection = conn; cmd.CommandType = 1; cmd.CommandText = "SELECT TOP 1 * FROM [User] WHERE UserName = ? AND Password = ?"; cmd.Parameters.Append(cmd.CreateParameter("@UserName", 200, 1, 20, "user01")); cmd.Parameters.Append(cmd.CreateParameter("@Password", 200, 1, 16, "123456")); var rs = cmd.Execute(); Response.Write(rs("UserId").value); rs.Close(); conn.Close();
在ASP.NET程序中使用参数化查询
ASP.NET环境下的查询化查询也是通过Connection对象和Command对象完成。如果数据库是SQL Server,就可以用有名字的参数了,格式是“@”字符加上参数名。
SqlConnection conn = new SqlConnection("server=(local)\SQL2005;user id=sa;pwd=12345;initial catalog=TestDb"); conn.Open(); SqlCommand cmd = new SqlCommand("SELECT TOP 1 * FROM [User] WHERE UserName = @UserName AND Password = @Password"); cmd.Connection = conn; cmd.Parameters.AddWithValue("UserName", "user01"); cmd.Parameters.AddWithValue("Password", "123456"); SqlDataReader reader = cmd.ExecuteReader(); reader.Read(); int userId = reader.GetInt32(0); reader.Close(); conn.Close();
在PHP程序中使用参数化查询
MySQL的参数格式与SQL Server有点区别,是以“?”加上参数名。
MySqlConnection conn = new MySqlConnection("server=127.0.0.1;uid=root;pwd=12345;database=test;"); conn.Open(); MySqlCommand cmd = new MySqlCommand(“SELECT * FROM `User` WHERE UserName = ?UserName AND Password = ?Password LIMIT 1″); cmd.Connection = conn; cmd.Parameters.AddWithValue(”UserName”, “user01″); cmd.Parameters.AddWithValue(”Password”, “123456″); MySqlDataReader reader = cmd.ExecuteReader(); reader.Read(); int userId = reader.GetInt32(0); reader.Close(); conn.Close();