DataSet dataSet1=new DataSet();
   SqlDataAdapter sda;
    SqlCommandBuilder scb;
      ...
  dataGridView1.DataSource = dataSet1.Tables[0];
   scb = new SqlCommandBuilder(sda);
   sda.Update(dataSet1);用这种方法增加和更改数据都没有问题。。但是用来删除数据总是删除不掉,DataGridView上面显示删除了。。但是数据库里面并没有删除。
if (dataGridView1.Rows.Count > 0)
            {
                dataSet1.Tables[0].Rows.RemoveAt(currentIndex);
                //dataSet1.Tables[0].Rows[currentIndex].Delete();
                //dataSet1.Tables[0].AcceptChanges();                scb = new SqlCommandBuilder(sda);
                sda.Update(dataSet1);                dataGridView1.DataSource = dataSet1.Tables[0];
            }

解决方案 »

  1.   

    还有问题就是:使用这句:sbc=new SqlCommandBuilder(); sda.Update(dataSet1); 时我并没有手动的建立数据库的连接,难道他们可以自动的建立连接?
      

  2.   

    DATASET是在数据库关闭的时候也可以用的吧,我也刚学c#,感觉dataset是个缓存里的临时数据库~~
      

  3.   

        DataSet是ADO.NET的中心概念.可以把DataSet当成内存中的数据库,DataSet是不依赖与数据库的独立数据集合.所谓独立,就是说,即使断开数据链路,或者关闭数据库,DataSet依然是可用的.DataSet在内部是用XML来描述数据的,由于XML是一种与平台无关、与语言无关的数据描述语言,而且可以描述复杂关系的数据,比如父子关系的数据,所以DataSet实际上可以容纳具有复杂关系的数据,而且不在依赖于数据库链路。
      正是由于DataSet才使得程序员在编程时可以屏蔽数据库之间的差异,从而获得一致的编程模型。DataSet支持多表、表间关系、数据约束等,和关系数据库的模型基本一致。
      DataSet 是 ADO.NET 结构的主要组件,它是从数据源中检索到的数据在内存中的缓存。DataSet 由一组 DataTable 对象组成,您可使这些对象与 DataRelation 对象互相关联。您还可通过使用 UniqueConstraint 和 ForeignKeyConstraint 对象在 DataSet 中实施数据完整性。有关使用 DataSet 对象的详细信息,请参见 在 ADO.NET 中使用 DataSet。这是比较专业的说法~~
      

  4.   

      scb = new SqlCommandBuilder(sda); 这个命令只能用于单表,多表不行
    SCb 会自动生成 updateCommand,deleteCommand 命令,
    当执行sda.Update()时自动连接数据源,更新数据
    所以你能够更新数据库 this.Validate();
     ds.Update(ds.Tables[0]);
      

  5.   

    不知道你的意思  没太看你的代码
     但我估计的是你更新后没提交状态导致
    更新后提交状态
    ds.AcceptChanges();
      

  6.   

    楼主的写法有问题,更新到数据库的顺序应为:dataSet1.Tables[0].Rows[currentIndex].Delete();
    //dataSet1.Tables[0].AcceptChanges();    //这一句会提交所有更改,Update时将检测不到任何修改,因此应将它移到Update()之后,详情参看MSDN
    scb = new SqlCommandBuilder(sda);
    sda.Update(dataSet1);                    
    dataSet1.Tables[0].AcceptChanges();
    dataGridView1.DataSource = dataSet1.Tables[0]; 
      

  7.   

    dataSet1.Tables[0].Rows.RemoveAt(currentIndex); 调用 RemoveAt 等同于先调用 Delete 再调用 AcceptChanges。
    因此当Update()时,同样的也检测不到该DataTable的任何修改。楼主有空的话应该看看MSDN里面关于DataAdapter.Update()的工作机制,以及DataTable.AcceptChanges()、DataSet.AcceptChanges()方法的作用。里面都有详细的说明 。