DataTable.AcceptChanges的理解

OleDbDataAdapter 怎么更新不了数据库?

String    tbName    =    ds.Tables[0].TableName;

String    tem    =    ds.Tables[0].Rows[0]["BOMID"].ToString();

DataRow    dr    =    ds.Tables[0].NewRow();

dr["BOMID"]    =    "104";

dr["Quantity"]    =    10;

ds.Tables[0].Rows.Add(dr);

ds.AcceptChanges();

oleAdaper.Update(ds,ds.Tables[0].TableName);//这里不就是更新数据库吗?

删掉ds.AcceptChanges();就行了。

这是为什么呢?

oleAdaper.Update    :对dataRow    的RowState等于deleted/inserted/updated调用响应的delete等    command进行更新

ds.AcceptChanges():将所有的dataRow的Rowstate更改为unchanged,因此也就没有任何数据更新

或者更改为

oleAdaper.Update(ds,ds.Tables[0].TableName);//

ds.AcceptChanges();

顺序颠倒一下,以便做其他用途

一个DataRow对象刚被创建之后其状态是Detached,是孤立的一个存在,所以建立了DataRow之后在DataRow中的单元填充了数据后还要通过DataTable.Rows.Add(DataRow)方法将此DataRow添加到DataTable,DataRow添加到DataTable后, 这个DataRow的状态就转变为Added。当修改了这个DataRow后,这个DataRow状态转为Modified,当用DataRow.Delete()方法删除DataRow后,DataRow状态将转为Deleted,不过此行还存在在DataTable中的,只是状态改变了,这时用DataTable.Rows.Count查看行数,跟删除前是一样的。只有在调用了DataTable.Remove(DataRow)方法后,此DataRow才被从DataTable移除,状态也回复到Detached孤立状态。

一旦调用了DataTable.AcceptChanges()方法后,所有的行将根据不同的状态做不同的处理,Added、Modified、Unchanged将保留当前值,Deleted的行将从DataTable中移除,最后所有的行的状态都置为Unchanged。当DataTable是从DataAdapter.Fill(DataSet,DataTable)方法填充而形成的,Fill()方法将自动调用AcceptChanges()方法,将DataTable的行状态都置为Unchanged。并且,如果Fill方法中指定的那个DataTable在要填充的那个DataSet不存在时,会生成一个跟数据源表同样的结构的DataTable并填充数据

用于从 DataTable 对象中删除 DataRow 对象的方法有两种:DataRowCollection 对象的 Remove 方法和 DataRow 对象的 Delete 方法。Remove 方法从 DataRowCollection 中删除 DataRow,而 Delete 方法只将行标记为删除。当应用程序调用 AcceptChanges 方法时,才会发生实际的删除。通过使用 Delete,您可以在实际删除之前先以编程方式检查哪些行标记为删除。如果将行标记为删除,其 RowState 属性会设置为 Deleted。

在将 DataSet 或 DataTable 与 DataAdapter 和关系型数据源一起使用时,用 DataRow 的 Delete 方法移除行。Delete 方法只是在 DataSet 或 DataTable 中将行标记为 Deleted,而不会移除它。而 DataAdapter 在遇到标记为 Deleted 的行时,会执行其 DeleteCommand 方法以在数据源中删除该行。然后,就可以用 AcceptChanges 方法永久移除该行。如果使用 Remove 删除该行,则该行将从表中完全移除,但 DataAdapter 不会在数据源中删除该行。

时间: 2024-11-03 15:14:02

DataTable.AcceptChanges的理解的相关文章

DataTable.AcceptChanges方法有何用处

提交自上次调用 AcceptChanges 以来对该表进行的全部更改. 调用 AcceptChanges 后,再用 DataAdapter.Update() 不会有不论什么新数据被更新到数据库中.那--那它有什么用处呢? 曾经的做法: Fill –> Edit –>Update –> 又一次Fill –> Edit –> Update –> -- "更新了数据当然要又一次获取啦!",再次更新后,再再次又一次获取. 如今的做法: Fill –>

DataTable && SqlDataReader帮助理解小程序

// 2015/07/08 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data; using System.Data.SqlClient; namespace DataTapleSample { class Program { static void Main(string[] ar

利用DataSet更改数据,将更改保存到数据库中

  RowState 是 DataRow 很重要的一个属性, 表示 DataRow 当前的状态. RowState 有 Added, Modified, Unchanged, Deleted, Detached 几种, 分别表示 DataRow 被添加, 修改, 无变化, 删除, 从表中脱离. 在调用一些方法或者进行某些操作之后, 这些状态可以相互转化. DataAdapter 可以根据 RowState 来决定如何影响数据库等存储位置. 如果 DataRow 的状态为 Added,DataAd

DataTable的AcceptChanges()和RejectChanges()方法

一.DataTable.AcceptChanges()方法 提交自上次调用AcceptChanges()方法以来对该表进行的所有更改.调用AcceptChanges()时,任何扔处于编辑模式的DataRow对象将成功结束其编辑.DataRowState也会随之更改:所有状态为Added何Modified的行的状态都变为Unchanged;状态为Deleted的行则被移除. 在尝试使用DbDataAdapter.Update方法更新DataSet之后,通常会对DataTable调用AcceptCh

C#中删除DataTable中的行的方法

1.在C#中,如果要删除DataTable中的某一行,大约有以下几种办法: •使用DataTable.Rows.Remove(DataRow),或者DataTable.Rows.RemoveAt(index):可以直接删除行•datatable.Rows[i].Delete().Delete()之后需要datatable.AccepteChanges()方法确认完全删除,因为Delete()只是将相应列的状态标志为删除,还可以通过datatable.RejectChanges()回滚,使该行取消

C# Datatable删除行的Delete和Remove方法

delete和remove Delete的使用是 datatable.Rows[i].Delete(); Remove的使用是datatable.Rows.Remove(datatable.Rows[i]); 这两个的区别是,使用delete后,只是该行被标记为deleted,但是还存在,用Rows.Count来获取行数时,还是删除之前的行数.需要使用datatable.AcceptChanges()方法来提交修改. 而Remove方法则是直接删除. 如果在for循环里删除行的话,最好是使用de

C# DataTable 详解

添加引用 using System.Data; 创建表 //创建一个空表 DataTable dt = new DataTable(); //创建一个名为"Table_New"的空表 DataTable dt = new DataTable("Table_New"); 创建列 //1.创建空列 DataColumn dc = new DataColumn(); dt.Columns.Add(dc); //2.创建带列名和类型名的列(两种方式任选其一) dt.Colu

Datatable删除行的Delete和Remove方法介绍

在实际项目开发中,如果要删除DataTable中的某一行,大约有以下几种办法: 使用DataTable.Rows.Remove(DataRow),或者DataTable.Rows.RemoveAt(index):可以直接删除行 datatable.Rows.Delete().Delete()之后需要datatable.AccepteChanges()方法确认完全删除,因为Delete()只是将相应列的状态标志为删除,还可以通过datatable.RejectChanges()回滚,使该行取消删除

循环删除DataTable.Row中的多行问题

在C#中,如果要删除DataTable中的某一行,大约有以下几种办法: 1,使用DataTable.Rows.Remove(DataRow),或者DataTable.Rows.RemoveAt(index):可以直接删除行 2,datatable.Rows[i].Delete().Delete()之后需要datatable.AccepteChanges()方法确认完全删除,因为Delete()只是将相应列的状态标志为删除,还可以通过datatable.RejectChanges()回滚,使该行取