部分摘自asp.net3.5从入门到精通c#2008
asp.net要执行删除和更新操作实际并不复杂,只要使用一个数据命令(Command)对象,使用Update, Insert 或者Delete 这三个语句之一。在执行删除、更新或插入操作时,并不需要获取获取数据,因此也并不需要使用DataReader对象。
要执行Updata、Insert或者 Delete语句,只需要创建一个数据命令(Command)对象,然后调用其ExecuteNonQuery()方法来执行数据命令。ExecuteNonQuery()方法将返回受影响的记录数,可以通过检查该方法的返回值,以判断对数据库的操作是否执行成功。例如,如果试图执行一个更新或者删除操作,但是ExecuteNonQuery()方法的返回值为0,则表示操作失败,这个能使由于数据库中并不存在于Where子句中的筛选条件相匹配的记录。(另外,如果该SQL命令具有语法错误,或者该SQL命令试图检索一个数据库中并不存在的表时,将会产生异常。)
这里只说一下更新的方法,先是不安全的代码:
string insertSQL;
insertSQL = " INSERT INTO Authors ( " ;
insertSQL += " au_id, au_fname, au_lname, " ;
insertSQL += " phone, adress, sity, state, zip, contract) " ;
insertSQL += " VALUES (' " ;
insertSQL += txtID.Text + " ', ' " ;
insertSQL += txtFirstName.Text + " ', ' " ;
insertSQL += ...
...
...
insertSQL += txtZip.Text + " ') " ;
SqlConnection con = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand(insertSQL, con);
// 尝试打开数据库连接并执行更新。
int added = 0 ;
try
{
con.Open();
added = cmd.ExecteNonQuery();
lblStatus.Text = added.ToString() + " records inserted. " ;
}
catch (Exception err)
{
lblStatus.Text = " Error inserting record. " ;
lblStatus.Text += err.Message;
}
finally
{
con.Close();
}
// added判断操作是否成功
这个例子是把字符串在代码中连接起来组成一个SQL字符串,然后再通过command执行这个动态生成的SQL语句。这个办法虽然简单但是存在很大的缺陷,如果用户无意或有意的输入一些特殊字符如单引号(')或者注入一些恶意代码,后果就严重了。
为了创建更加稳定的数据命令,可以使用ado.net的参数化数据命令(parameterized command)。在参数化数据命令中,使用参数作为占位符来替代硬编码的值。下面是更改后的代码(更改的地方用下划线):
string insertSQL;
insertSQL = " INSERT INTO Authors ( " ;
insertSQL += " au_id, au_fname, au_lname, " ;
insertSQL += " phone, adress, sity, state, zip, contract) " ; "
insertSQL += " VALUES (' " ;
insertSQL += "@au_id, @au_fname, @au_lname, ";
insertSQL += "@phone, @address, @city, @state, @zip, @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("@phone", txtPhone.Text);
...
...
...
cmd.Parameters.AddWithValue("@zip" , txtZip.Text);
// 尝试打开数据库连接并执行更新。
int added = 0 ;
try
{
con.Open();
added = cmd.ExecteNonQuery();
lblStatus.Text = added.ToString() + " records inserted. " ;
}
catch (Exception err)
{
lblStatus.Text = " Error inserting record. " ;
lblStatus.Text += err.Message;
}
finally
{
con.Close();
}
// added判断操作是否成功
对于不同的数据提供程序,参数化数据命令的语法是不同的。对于S