OleDbDataAdapter.Update(DataSet,srcTable) 可以更新数据到数据库
DataSet.AcceptChanges()更新成功后,同步内存表用的,该方法和数据库操作无关,通常将数据更新到数据库后,让内存表和物理表做一下同步而已。

解决方案 »

  1.   

    DataSet.AcceptChanges()的意思是更新后同步更新内存表,不执行sql的。也就是说你DataSet里数据通过Update更新后将DataSet的数据同步。详情请查看CLR via C#
      

  2.   


    还不是很明白,我的理解有两个歧义
    1、 AcceptChanges方法就是把 DataSet 里的所有数据状态变成 未被修改 ~?
    2、 AcceptChanges方法会导致 DataSet 里的所有数据重新从数据库读取,达到同步的目的?
    另外就是,我更新数据库之后,同步,以哪个为准?是以被我修改过的 DataSet ?还是以 更新后的数据 为准?我的猜想是,某些更新,可能不成功,此种情况会产生什么问题呢~?
      

  3.   

    1、AcceptChanges仅仅改变内存表,调用后内存表数据行状态都变成为更改状态
    2、当你修改完内存表后,又提交到数据库(真实的保存了),但是此刻内存表和数据库就不一样了,
       调用AcceptChanges()之后,刚才内存表所有改变和数据库一样了。AcceptChanges()不会从数据库提取任何数据,仅仅是内存数据的变动
    通常是更新到数据库后,调用该方法用来同步。
      

  4.   


    看 MSDN,是一个跟数据库没有任何关系的方法:
    http://msdn.microsoft.com/zh-cn/library/system.data.dataset.acceptchanges(VS.80).aspx至于你说的 Update,它可能会在完成后调用 DataSet.AcceptChange()
      

  5.   

    Update 根据 DataRow.RowState(Add,Mod,Del)
    来分别调用 UpdateCommand, InsertCommand, DeleteCommand。
    AcceptChanges() 则会把所有的 RowState 修改为 UnChange。所以,顺序不要弄错了。AcceptChanges 之后再 Update,就查不到被改变行,而不会去更新数据库。
      

  6.   

    那,我想要一键更新 DataSet 里所有 DataTable 的数据,应该用什么方法呢~?
      

  7.   

    不同表对应有不同的Schema,他们 XXXCommand 也不一样。你需要重新用各自对应的 Adapter 去 Update
      

  8.   


    我们使用自己编写的DLL,直接更新DataTable或DataSet,
    缺点:效率低
    优点:编码真简单
      

  9.   


    DataSet 如果有个 Update 方法就好了,呵呵~
      

  10.   

    照这么说,如果我要放弃修改就用 AcceptChanges()
    那还有一个Reset(),什么时候用呢?
      

  11.   


    是这样的
    OleDbDataAdapter.Update或根据数据行的RowState 来的
      

  12.   

      
           public DataSet Insert_Sdp()
            {
                SqlConnection con = new SqlConnection(Configuration.Conn);
                SqlDataAdapter sdp = new SqlDataAdapter();
                DataSet dt = new DataSet();
                SqlCommand comm = new SqlCommand();            comm.Connection = con;
                comm.CommandText = "select Names,Address,Pid,Image from  Users";
                sdp.SelectCommand = comm;//首先要指定selectitem,并且字段要制定清楚,和insert字段个数和名称一致
                SqlCommandBuilder scom = new SqlCommandBuilder(sdp);
                sdp.Fill(dt, "Users");            comm.CommandText = "Insert into Users values(@Pid,@Names,@Address,@Image)";
                SqlParameter[] pars = new SqlParameter[] { 
                 new SqlParameter("@Pid",SqlDbType.Int,4,"Pid")
                ,new SqlParameter("@Names",SqlDbType.VarChar,10,"Names")
                ,new SqlParameter("@Address",SqlDbType.NVarChar,20,"Address")
                ,new SqlParameter("@Image",SqlDbType.Image,200,"Image")
                };              DataRow dr = null;
                  for (int i = 7; i < 10; i++)
                  {
                      dr = dt.Tables[0].NewRow();
                      dr["Names"] = "Jeep" + i.ToString();
                      dr["Address"] = "第" + i.ToString() + "街道";
                      dr["Pid"] = i + 8;
                      dt.Tables[0].Rows.Add(dr);
                  }//通过对表值的修改,实现方法Update(table)              SqlCommandBuilder icom = new SqlCommandBuilder(sdp);
                  sdp.InsertCommand = comm;//insert com语句
                  sdp.Update(dt.Tables["Users"]);
                  dt.AcceptChanges();
                return dt;
            }//我这里有简单的例子,你看一看,datble要加新的行,存储过程无需添加值,后和select的字段要一致。
      最后要有SqlCommandBuilder 实例化一次。 供参考