在参数化数据命令中,使用参数作为占位符来替代硬编码的值。这些参数将被分别添加,并自动进行特殊字符的编码处理。例如下面的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语句。