以下代码是摘录的,我不了解,单凭解释感觉有点多余,我知道是自己不了解,所以请教高人.
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();  又来修改一次,不知道是为什么,请教高人,帮忙指点一下,非常感谢. 

解决方案 »

  1.   

    ds 中的数据只是远程数据库的一个映象,
    ds 中的数据行是有状态的: 新增的, 修改了的, 删除的,...那个语句执行成功后, 远程的更新完毕了, 所以本地的映象也要同步一下,
    比如新增的行变为即有的行,在 beginedit 时候你可以看看表中各个行的 RowState
      

  2.   

    我觉得可以说没有多余。
    程序的目的是数据库的操作和前台的数据是分开的。没有使用SqlDataAdapter的Updata更新数据,而使用了SqlCommand去修改数据库时的数据。然后再修改原来取出的数据以保持和数据库里的记录一致。我觉得,这是很正常的操作。
      

  3.   

    一般的逻辑是这样:
    1.在查出数据时,就打开BeginEdit();
    2.这个button2_Click就是更新:
       a. EndEdit()
          ds.AcceptChanges()
       b. 用SqlDataAdapter的Updata更新数据(这个要求先ds.AcceptChanges())
           或
           像楼主那样用SqlCommand(用这个的话a b可以对换)BeginEdit()后马上EndEdit(),确实让人感觉有点...
      

  4.   

    ds.Tables["学生表"].Rows[pos].BeginEdit();  //对象开始编辑操作.
    ds.Tables["学生表"].Rows[pos].EndEdit();  //终止发生在该行的编辑
    ds.AcceptChanges();  //修改数据集 这是一个辨析题,我先表明观点:前面两句是多余的,最好一句写得也不好1.AcceptChanges()方法最好用在DataRows上面,在这种情况下不推荐用在DataSet上,在DataRow上效率要高,出错的概率也要小2.前两句的应用场景是:BeginEdit()方法用在更新数据库之前,EndEdit()用在更新数据库之后,在中间出错时可以回滚
      

  5.   

    private void button2_Click(object sender, EventArgs e) 
            { 
            ds.Tables["学生表"].Rows[pos].BeginEdit();  //对象开始编辑操作.
                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.AcceptChanges();  //修改数据集 
                ds.Tables["学生表"].Rows[pos].EndEdit();  //终止发生在该行的编辑
                MessageBox.Show("数据已修改"); 
            }
    是不是要改成上面这样子,我感觉不太对,
    ds.Tables["学生表"].Rows[pos].BeginEdit();  //对象开始编辑操作. 
                ds.Tables["学生表"].Rows[pos].EndEdit();  //终止发生在该行的编辑 
    上面两句作用我还是不明白,特别是 为什么终止之后,为什么还可以 ds.AcceptChanges(); 不明白
      

  6.   

      ds.Tables["学生表"].Rows[pos].BeginEdit();  //对象开始编辑操作. 
      ds.Tables["学生表"].Rows[pos].EndEdit();  //终止发生在该行的编辑 
    多余的。更改数据绑定控件值的时候,会隐式调用BeginEdit ,
    AcceptChanges的时候,会隐式调用EndEdit。