部分摘自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判断操作是否成功
对于不同的数据提供程序,参数化数据命令的语法是不同的。对于SQL Server,参数名可以任意选取,但是必须以@字符开通。通常情况下我们将@使用的字段名作为相应的参数名。而OLE DB是用?来占位。通过addwithvalue来添加parameter对象,当然添加的顺序是无关紧要的。 这样在参数中出现的引号或者SQL语句片段将不会对SQL命令的执行造成任何问题。
书上的描述到这里为止,看了一下网上的其实还有另一种添加方法:Parameters.Add(...),它和之前的Parameters.AddWithValue(...)区别是: " 在.Net Framework 2.0中SqlClient增加了AddWithValue(string parameterName, object value)方法。
效率的话有说这个高的也又说那个高的,不太清楚 据网上说Parameters.AddWithValue在传入数据是DataTime的时候会出错。 我觉得为了保险还是用Add比较好。
下面贴一段我自己用Add的代码,这里先放到一个sqlparameter对象里再一起加入。
代码
try
{
conn
=
new
SqlConnection(ConfigurationManager.ConnectionStrings[
"
nd_dataConnectionString
"
].ConnectionString);
//
取连接字符串,建立连接
conn.Open(); comm = new SqlCommand( " update nd_cn set name=@name,text=@text where id= " + textid, conn); SqlParameter[] pars = { new SqlParameter( " @name " ,SqlDbType.NVarChar, 50 ), new SqlParameter( " @text " ,SqlDbType.Text)}; pars[ 0 ].Value = TextBox1.Text; pars[ 1 ].Value = tbContent.Text; foreach (SqlParameter parameter in pars) { comm.Parameters.Add(parameter); } comm.ExecuteNonQuery(); } catch (SqlException e1) { Response.Write(e1.ToString()); } finally { conn.Close(); }
里面的SqlDbType要区分大小写,具体有哪些的话请参看msdn中表格:
最后再贴一段类似的代码提供比较
代码
try
{ openCon(); // sTran = con.BeginTransaction(); // 事务对象 cmd = new SqlCommand(sql,con); // cmd.Transaction = sTran; // 执行事务 // try // { // 调用存储过程 cmd.CommandType = CommandType.StoredProcedure; // 添加参数 SqlParameter[] pars = { new SqlParameter( " @FartherTypeID " ,SqlDbType.Int), new SqlParameter( " @DetailTypeID " ,SqlDbType.Int), new SqlParameter( " @LevelTypeID " ,SqlDbType.Int), new SqlParameter( " @BookName " ,SqlDbType.VarChar, 50 ), new SqlParameter( " @MarketPrice " ,SqlDbType.Money), new SqlParameter( " @MenberPrice " ,SqlDbType.Money), new SqlParameter( " @Rebate " ,SqlDbType.Float), new SqlParameter( " @BookWriter " ,SqlDbType.VarChar, 100 ), new SqlParameter( " @BookConcern " ,SqlDbType.VarChar, 50 ), new SqlParameter( " @ISBN " ,SqlDbType.VarChar, 20 ), new SqlParameter( " @BookIntroduce " ,SqlDbType.VarChar, 5000 ), new SqlParameter( " @AddDateTime " ,SqlDbType.DateTime), new SqlParameter( " @BookPicture " ,SqlDbType.VarChar, 200 ), }; foreach (SqlParameter parameter in pars) { cmd.Parameters.Add(parameter); } return cmd.ExecuteNonQuery();
}
|
asp.net 用parameter对象更新数据2011-03-24 22:24asp.net 用parameter对象更新数据
最新推荐文章于 2019-07-15 16:28:18 发布
本文介绍了如何在ASP.NET中利用Parameter对象进行SQL Server数据库的更新操作,包括数据插入和异常处理。
摘要由CSDN通过智能技术生成