asp.net 用parameter对象更新数据
来源:互联网 发布:手机淘宝卖家如何登录 编辑:程序博客网 时间:2024/05/22 15:09
部分摘自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)方法。
该方法简化了调用储存过程的输入参数过程,在运行时对所输入的数据类型进行判断,获取对应的数据库类型。
因此该方法在运行效率上比用Add(string parameterName, SqlDbType sqlDbType, int size, string sourceColumn)方法要低。
在效率要求较高的地方仍然建议使用Add()方法,其它场合可以使用AddWithValue()简化代码编写量。"
效率的话有说这个高的也又说那个高的,不太清楚
据网上说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对象更新数据
- asp.net 用parameter对象更新数据2011-03-24 22:24asp.net 用parameter对象更新数据
- Asp.net 用DataSet对象更新数据(SqlDataAdapter)
- asp.net中用DataSet对象更新数据
- ADO.NET—Asp.net 用DataSet对象更新数据(SqlDataAdapter)
- Asp.net 用DataSet对象更新数据(SqlDataAdapter) DataTable加主键
- asp.net 数据层类 parameter参数访问方式
- ASP.NET基础教程-使用CommandBuilder对象自动生成SQL语句对数据进行批量更新
- asp.net大数据批量更新实现
- asp.net连接数据持续更新中。
- ASP.NET:使用DataTable对象保存数据
- 用parameter添加数据
- 用 DataSet 对象更新数据
- 用 DataSet 对象更新数据
- 用DataSet对象更新数据
- 用 DataSet 对象更新数据
- asp.net 中数据的批量插入和更新
- ASP.net:用SqlCommandBuilder 实现批量更新
- j2me学习笔记【7】——复选框的应用
- 两台linux完美实现双机热备
- 数据库书上的复习摘抄
- ubuntu C/C++ IDE
- LDAP error Code 及解决方法
- asp.net 用parameter对象更新数据
- 新人来了
- sql 级联
- 数据库书上概念摘抄
- asp.net连接数据库代码解释
- windows 域的LDAP查询相关举例
- php 二维数组按照某列排序
- qt模型视图
- 负载均衡解决方案(HA)之---LVS(Linux Virtual Server)