SqlConnection Connection = new SqlConnection("server=127.0.0.1;database=testData;uid=sa;pwd=8888;Connection TimeOut=600");
            Connection.Open();
            SqlDataAdapter da = new SqlDataAdapter("select * from test", Connection);
            DataSet ds = new DataSet();
            ds.Clear();
            da.Fill(ds, "MaketPrice");                        ds.Tables[0].Rows[0][0] = "test";
            ds.AcceptChanges();            //da = new SqlDataAdapter("", this.GetConn());            SqlCommandBuilder sqlCmdBuilder = new SqlCommandBuilder(da);            da.Update(ds, "MaketPrice");            ds.AcceptChanges();
            Connection.Close();            dataGridView2.DataSource = ds;
            dataGridView2.DataMember = "MaketPrice";为什么数据库没有没有发生变化,ds确实是发生变化了的,我用dataGridView显示出变化后的数据,确实发生了变化,但是数据为什么没有发生变化。

解决方案 »

  1.   

    你的da.Update(ds, "MaketPrice");
    确实改变了记录集,但是这只是从数据库里取出的数据,简单来说你没有对数据的表操作,只对记录集做了修改,是不可能改变数据库里的记录的。
      

  2.   

    ds.AcceptChanges();这句不要,数据库会起变化使用sqlCmdBuilder对DataSet做update时,.net通过rowstate属性来确定数据是否被更改过。
    AcceptChanges();
    将rowstate属性设为默认值,所以不会再对数据库操作。
      

  3.   

    ds.Tables[0].Rows[0][0] = "test";
                ds.AcceptChanges();            //da = new SqlDataAdapter("", this.GetConn());            SqlCommandBuilder sqlCmdBuilder = new SqlCommandBuilder(da);ps
    这里的 ds.AcceptChanges();
      

  4.   

    public DataSetUpdateByDataSet(DataSet ds,string strTblName,string strConnection)
      {
          SqlConnection  conn = new SqlConnection(strConnection));
             
         SqlDataAdapter myAdapter = new SqlDataAdapter();
         SqlCommand myCommand = new SqlCommand("select * from "+strTblName),(SqlConnection) conn);    
         myAdapter.SelectCommand = myCommand;
         SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myAdapter);     
      try      {                 lock(this)            //处理并发情况(分布式情况)              {               myAdapter.Update(ds,strTblName);                }      }  
     
      catch(Exception err)
     {   conn.Close();   
       throw new BusinessException(err);
     }    return ds;    //数据集的行状态在更新后会都变为: UnChange,在这次更新后客户端要用返回的ds}或public DataSet UpdateByDataSet(DataSet ds,string strTblName,string strConnection)
      {
       
      
          SqlConnection  conn = new SqlConnection(strConnection));         
          SqlCommand myCommand = new SqlCommand("select * from "+strTblName),(SqlConnection) conn);          SqlDataAdapter myAdapter = new SqlDataAdapter(myCommand );         SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myAdapter);     
          
          myAdapter.InsertCommand = myCommandBuilder .GetInsertCommand();      myAdapter.UpdateCommand = myCommandBuilder .GetUpdateCommand();     myAdapter.DeleteCommand = myCommandBuilder .GetDeleteCommand();   try  {        lock(this)                              //处理并发情况(分布式情况)       {              conn.Open();              myAdapter.Update(ds,strTblName);                conn.Close();       }
      
             return ds;    //数据集的行状态在更新后会都变为: UnChange,在这次更新后客户端要用返回的ds }
     catch(Exception err)
     {       conn.Close(); 
          throw new BusinessException(err);
     }
    }直接调用这两个方法的任意一个就OK啦,select * from "+strTblName是一定要的,
    主要是告诉 SqlDataAdapter更新哪个表
      

  5.   

    yuwenge(活得痛快):
    你说的不对,
      

  6.   

    CH_MARS(木头)
    你开始说的好像是对的,如果我不是修改记录集,而是插入一个新的记录,或者删除一个,确实可以保存到数据库,
    但是我就想改变一些值,保存到数据库,
    我的代码为什么不行,怎么改,你贴的代码太长,没看。
    我想找出我的代码不能更新的原因,
    并且应该怎么修改。
      

  7.   

    Me.oraConn.Open()
            Dim ds As New DataSet        Dim cb As New OracleClient.OracleCommandBuilder(Me.adp)
            Me.adp.UpdateCommand = cb.GetUpdateCommand
            Me.adp.DeleteCommand = cb.GetDeleteCommand
            Me.adp.InsertCommand = cb.GetInsertCommand
            'Me.adp.Fill(DataSet11.A_TEST)
            Me.adp.Fill(ds, "A_TEST")        ds.Tables(0).Rows(6)("A") = CInt(A)
            ds.Tables(0).Rows(6)("B") = CInt(B)
            ds.Tables(0).Rows(6)("C") = CInt(C)
            ds.Tables(0).Rows(6)("NAME") = Name
            Me.adp.Update(ds.Tables("A_TEST"))        Me.oraConn.Close()
    我的一个例子,可以更新的啊,没发现跟你的有什么区别
      

  8.   

    估计是这里的原因
    Me.adp.UpdateCommand = cb.GetUpdateCommand
    Me.adp.DeleteCommand = cb.GetDeleteCommand
    Me.adp.InsertCommand = cb.GetInsertCommand
      

  9.   

    ds.AcceptChanges();
    它只是对内存里的数据进行更改确定,并没有对数据库产生任务影响。
      

  10.   

    ds.Tables[0].Rows[0][0] = "test";
    ds.AcceptChanges();
    ------------------
    把ds.AcceptChanges();这句去掉.要不然你所有修改的行状都会变成DataRowState.Unchanged ;
    da就是要根据DataRowState来执行更新的.另外,本来是很简单的东西,CH_MARS(木头)写得这么复杂. myAdapter.InsertCommand 和 myCommandBuilder .GetInsertCommand()本来就是同一个引用,还去赋值干嘛呢?
      

  11.   

    ds.AcceptChanges(); 在Update之后调用。
      

  12.   

    式式用SqlCommand 
    看这句
         SqlCommand myCommand = new SqlCommand("select * from "+strTblName),(SqlConnection) conn);    
         myAdapter.SelectCommand = myCommand;
    你需要改UpdateCommand
      

  13.   

    还是不行啊。把ds.AcceptChanges();去掉还是不行啊。
      

  14.   

    我也遇到过类似的问题,最后我用ds.Tables[0].Rows[I][J]遍历代替的SqlCommandBuilder
      

  15.   

    把跟在ds.Tables[0].Rows[0][0] = "test";后面的那一行
                ds.AcceptChanges();
    去掉应该就可以了呀
      

  16.   

    要加上
    myAdapter.UpdateCommand = myCommandBuilder .GetUpdateCommand();
    我记得我上次遇到这个问题时就是这个原因。
    SqlDataAdapter myAdapter = new SqlDataAdapter(myCommand );         SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myAdapter);     
          
          myAdapter.InsertCommand = myCommandBuilder .GetInsertCommand();      myAdapter.UpdateCommand = myCommandBuilder .GetUpdateCommand();     myAdapter.DeleteCommand = myCommandBuilder .GetDeleteCommand();
    有三中方法。适合不同的操作。支持2.0的。