日期:2014-05-18  浏览次数:21007 次

以下修改代码为什么感觉有些地方多余

以下代码是摘录的,我不了解,单凭解释感觉有点多余,我知道是自己不了解,所以请教高人.
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。