在參數化數據命令中,使用參數作為占位符來替代硬編碼的值。這些參數將被分別添加,并自動進行特殊字符的編碼處理。例如下面的SQL語句: select * from customers where customerID='Alfki' 可以轉換為一個參數化的sql語句:select * from customers where customerID=@customerID
不同的數據提供程序,參數化數據命令的語法是不同的。對于sqlserver數據提供程序,參數化的數據命令是使用唯一的命名占位符作為參數。參數名可以任意選取,但是必須是以@字符開頭。通常情況下我們是以字段名作為相應的參數名(比如上面的語句中使用@customerID作為customerID字段的參數名)。ole DB數據提供程序則采用了不同的語法。它要求每一個參數使用一個問號(?)來表示,在其sql語句中,參數并不是通過參數名來標識的,而是根據參數在sql語句中出現的位置來標識的。如下面:select * from customers where customerID=?
無論用哪種方式來標識數據命令中的參數,都需要為sql語句中的每一個參數提供相應的Parameter對象,每一個Parameter對象都將被添加到Command.Parameters參數集合中。對于ole DB數據提供程序,一定要按照參數在sql語句中出現的順序來添加相應的Parameter對象。對于sql server數據提供程序來說,添加參數的順序是無關緊要的,因為參數將根據參數名來匹配相應的占位符。
protected void cmdInsert_Click(object sender, EventArgs e)
{
string insertSQL;
insertSQL="insert into authors(";
insertSQL+="au_id,au_fname,au_lname,
contract
) ";
insertSQL+="values(@au_id,@au_fname,@au_lname,@contract)";
sqlConnection con=new sqlConnection(connectionstring);
sqlCommand cmd=new sqlCommand(insertSQL,con);
//添加相應的參數
cmd.Parameters.AddWithValue("@au_id",txtID.text);
cmd.Parameters.AddWithValue("@au_fname",txtFirstName.text);
cmd.Parameters.AddWithValue("@au_lname",txtLastName.text);
cmd.Parameters.AddWithValue("@
contract
",Convert.ToInt16(chkContract.Checked));
int added=0;
try
{
con.Open();
added=cmd.ExecuteNonQuery();
lblstatus.Text=added.ToString()+"條記錄已插入";
}
Catch(Exception err)
{
lblstatus.Text="錯誤:"+err.Message;
}
finally
{
con.Close();
}
}
使用參數化的數據命令,參數值已經從sql命令中移除,并添加到了Parameters集合中。這樣,在參數值中出現的引號或者sql語句片段將不會對sql命令的執行造成任何問題。這樣也就可以防sql注入式攻擊。
增、刪、改功能都可以用這種參數化數據命令寫sql語句。