以下修改代码为什么感觉有些地方多余
以下代码是摘录的,我不了解,单凭解释感觉有点多余,我知道是自己不了解,所以请教高人.
private void button2_Click(object sender, EventArgs e)
{
SqlConnection cn = new SqlConnection(str);
cn.Open();
string sql = "update student set sage = '" + textBox4.Text.Trim() + "' where sno = '" +
textBox1.Text.ToString() + "'";
SqlCommand cmd = new SqlCommand(sql, cn);
cmd.ExecuteNonQuery(); //这前面这一段我是非常了解,也就是更新sql server内的数据,后面的我就开始糊涂了,感觉后面的代码多余.
cn.Close();
ds.Tables["学生表"].Rows[pos].BeginEdit(); //对象开始编辑操作.
ds.Tables["学生表"].Rows[pos].EndEdit(); //终止发生在该行的编辑
ds.AcceptChanges(); //修改数据集
MessageBox.Show("数据已修改");
}
我的理解是从cn.close后面的代码是用来修改数据集的.
只是 ds.Tables["学生表"].Rows[pos] 一下子编辑,一下子终止的,不知道是为什么, 本来这里已经编辑了,但ds.AcceptChanges(); 又来修改一次,不知道是为什么,请教高人,帮忙指点一下,非常感谢.
------解决方案--------------------ds 中的数据只是远程数据库的一个映象,
ds 中的数据行是有状态的: 新增的, 修改了的, 删除的,...
那个语句执行成功后, 远程的更新完毕了, 所以本地的映象也要同步一下,
比如新增的行变为即有的行,
在 beginedit 时候你可以看看表中各个行的 RowState
------解决方案--------------------一般的逻辑是这样:
1.在查出数据时,就打开BeginEdit();
2.这个button2_Click就是更新:
a. EndEdit()
ds.AcceptChanges()
b. 用SqlDataAdapter的Updata更新数据(这个要求先ds.AcceptChanges())
或
像楼主那样用SqlCommand(用这个的话a b可以对换)
BeginEdit()后马上EndEdit(),确实让人感觉有点...
------解决方案--------------------ds.Tables["学生表"].Rows[pos].BeginEdit(); //对象开始编辑操作.
ds.Tables["学生表"].Rows[pos].EndEdit(); //终止发生在该行的编辑
ds.AcceptChanges(); //修改数据集
这是一个辨析题,我先表明观点:前面两句是多余的,最好一句写得也不好
1.AcceptChanges()方法最好用在DataRows上面,在这种情况下不推荐用在DataSet上,在DataRow上效率要高,出错的概率也要小
2.前两句的应用场景是:BeginEdit()方法用在更新数据库之前,EndEdit()用在更新数据库之后,在中间出错时可以回滚
------解决方案-------------------- ds.Tables["学生表"].Rows[pos].BeginEdit(); //对象开始编辑操作.
ds.Tables["学生表"].Rows[pos].EndEdit(); //终止发生在该行的编辑
多余的。
更改数据绑定控件值的时候,会隐式调用BeginEdit ,
AcceptChanges的时候,会隐式调用EndEdit。