參數化查詢(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();
View Code
在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
的參數格式與
SQLServer有點差別,是以“?”加上參數名。

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();