由于项目中设计DataSet中的DataTable数据增删改等,而这些和DataTable的行状态和版本,AcceptChange()和 RejectChanges().而理解好这些对于DataTable的增删改等操作有很多帮助。
下面是参考MSDN汇总和总结:
(1)对 DataSet、DataTable 或 DataRow 调用 AcceptChanges 时,会移除行状态为 Deleted 的所有行。 剩余行的行状态为 Unchanged,并且 Original 行版本中的值将被 Current 行版本值覆盖。 调用 RejectChanges 时,会移除行状态为 Added 的所有行。 剩余行的行状态为 Unchanged,并且 Current 行版本中的值将被 Original 行版本值覆盖。
(2)RowState 的值取决于两个因素:已对该行执行的操作的类型,以及是否已对 DataRow 调用了 AcceptChanges。
(3)AcceptChange提交自上次调用 AcceptChanges 以来对该行进行的所有更改:在调用 AcceptChanges 时,EndEdit 方法被隐式调用,以便终止任何编辑。如果行的 RowState 原来是“Added”或“Modified”,则 RowState 将变成“Unchanged”。如果 RowState 是“删除”,则该行将被移除。
(4)DataRow 删除:Remove 方法从 DataRowCollection 中删除 DataRow,而 Delete 方法只将行标记为删除。 当应用程序调用 AcceptChanges 方法时,才会发生实际的删除。 通过使用 Delete,您可以在实际删除之前先以编程方式检查哪些行标记为删除。 如果将行标记为删除,其 RowState 属性会设置为 Deleted。
(5)在将 DataSet 或 DataTable 与 DataAdapter 和关系型数据源一起使用时,用 DataRow 的 Delete 方法移除行。 Delete 方法只是在 DataSet 或 DataTable 中将行标记为 Deleted,而不会移除它。 而 DataAdapter 在遇到标记为 Deleted 的行时,会执行其 DeleteCommand 方法以在数据源中删除该行。 然后,就可以用 AcceptChanges 方法永久移除该行。 如果使用 Remove 删除该行,则该行将从表中完全移除,但 DataAdapter 不会在数据源中删除该行。DataRowCollection 的 Remove 方法采用 DataRow 作为参数
下面是自己的理解的
(1)标记行状态Deleted+AccpetChanges方法《==》Remove 都是删除内存中的DataTable中的行。要想真正删除数据中的行,标记为Deleted,DataAdapter 在遇到标记为 Deleted 的行时,会执行其 DeleteCommand 方法以在数据源中删除该行.
(2)所有真正操作关系数据的记录是通过DataAdapter 在遇到行状态(Added,Modeified、Deleted)标记,执行其 DeleteCommand 方法以在数据源添加、修改、删除行信息。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; namespace RowStateDemo { class Program { static void Main(string[] args) { DemonstrateRowState(); } private static void DemonstrateRowState() { // Run a function to create a DataTable with one column. DataTable table = MakeTable(); DataRow row1; DataRow row2; DataRow row3; // Create a new DataRow. row1 = table.NewRow(); string colName="Name"; row1[colName] = "ZhangSan"; row2 = table.NewRow(); row2[colName] = "LiSi"; row3 = table.NewRow(); row3[colName] = "WangWu"; DataRow[] rows = table.Select(); DataRow[] createRows = new DataRow[] { row1, row2, row3 }; //打印所有 Console.WriteLine("----------Print Had Created All Row-------------"); Console.WriteLine("TableRowCount:{0}",table.Rows.Count); foreach (DataRow dr in createRows) { object[] array = new object[] { dr[colName].ToString(), dr.RowState, dr[colName, DataRowVersion.Default] }; Console.WriteLine(string.Format("Create A Row Operation:Name={0}\n RowState:{1}\n DefalutVersion:{2}\n", array)); } Console.WriteLine("-------------Print All Had Add Row---------------"); // AddRow row. Console.WriteLine("TableRowCount:{0}", table.Rows.Count); foreach (DataRow dr in createRows) { table.Rows.Add(dr); object[] array = new object[] { dr[colName], dr.RowState, dr[colName, DataRowVersion.Default], dr[colName, DataRowVersion.Current] }; Console.WriteLine(string.Format("AddRow Operation:Name={0}\n RowState:{1}\n DefalutVersion:{2}\n CurrentVersion:{3}\n ", array)); } Console.WriteLine("----------Print All Had Add Row-----------"); //Table AcceptChanges Unchanged row table.AcceptChanges(); Console.WriteLine("TableRowCount:{0}", table.Rows.Count); foreach (DataRow dr in table.Rows) { object[] array = new object[] { dr[colName].ToString(), dr.RowState, dr[colName, DataRowVersion.Default], dr[colName, DataRowVersion.Current], dr[colName, DataRowVersion.Original] }; Console.WriteLine(string.Format("Table AcceptChanges Operation:Name={0}\n RowState:{1}\n DefalutVersion:{2}\n CurrentVersion:{3}\n OriginalVersion:{4}\n", array)); } Console.WriteLine("------------------Print All RowState(Some Rows Had Modify)------------"); // Modified row. row2[colName] = "LiBa"; Console.WriteLine("TableRowCount:{0}", table.Rows.Count); foreach (DataRow dr in table.Rows) { object[] array = new object[] {dr[colName].ToString(), dr.RowState,dr[colName, DataRowVersion.Default], dr[colName, DataRowVersion.Current], dr[colName, DataRowVersion.Original] }; Console.WriteLine(string.Format("Modified Operation:Name={0}\n RowState-{1}\nDefalutVersion-{2}\n CurrentVersion{3}\n OriginalVersion{4}\n ", array)); } // Deleted row. Console.WriteLine("--------------Print All RowState(Some Rows Had Deleted)--------------"); row3.Delete(); DataRow[] deletRows = table.Select(null, null,DataViewRowState.Deleted); //var r = row3[colName].ToString(); //var s= deletRows[0].RowState; //var t=table.Rows.Count; //var m=deletRows[0][colName, DataRowVersion.Default]; //var n=deletRows[0][colName, DataRowVersion.Original]; //object[] arrayDel = new object[] { s,t ,m ,n }; //Console.WriteLine("Deleted Operation: RowState-{0},TableRowCount-{1},DefalutVersion-{2},OriginalVersion{3} ", arrayDel); Console.WriteLine("TableRowCount:{0}", table.Rows.Count); object[] arrayDel = new object[] {row3.RowState}; Console.WriteLine("Deleted Operation: RowState-{0}", arrayDel); Console.WriteLine("----------------Print All After Table AcceptChanges------------"); //调用 AcceptChanges 时,会移除行状态为 Deleted 的所有行。 剩余行的行状态为 Unchanged,并且 Original 行版本中的值将被 Current 行版本值覆盖。 table.AcceptChanges(); Console.WriteLine("TableRowCount:{0}", table.Rows.Count); foreach (DataRow dr in table.Rows) { object[] array = new object[] { dr[colName].ToString(), dr.RowState, dr[colName, DataRowVersion.Default], dr[colName, DataRowVersion.Current], dr[colName, DataRowVersion.Original] }; Console.WriteLine(string.Format("Table AcceptChanges Operation:Name={0}\n RowState:{1}\n DefalutVersion:{2}\n CurrentVersion{3}\n OriginalVersion{4}\n ", array)); } Console.WriteLine("------------Print All After Table RejectChanges------------------"); //调用 RejectChanges 时,会移除行状态为 Added 的所有行。 剩余行的行状态为 Unchanged,并且 Current 行版本中的值将被 Original 行版本值覆盖。 row1[colName] = "ZhangJiu"; DataRow newRow= table.NewRow(); newRow[colName] = "XiHaHa"; table.Rows.Add(newRow); table.RejectChanges(); Console.WriteLine("TableRowCount:{0}", table.Rows.Count); foreach (DataRow dr in table.Rows) { object[] array = new object[] { dr[colName].ToString(), dr.RowState,dr[colName, DataRowVersion.Default], dr[colName, DataRowVersion.Current], dr[colName, DataRowVersion.Original] }; Console.WriteLine(string.Format("Table RejectChanges Operation:Name={0}\n RowState:{1}\n DefalutVersion:{2}\n CurrentVersion:{3}\n OriginalVersion{4}\n ", array)); } Console.ReadKey(); } private static DataTable MakeTable() { // Make a simple table with one column. DataTable table = new DataTable("table"); DataColumn dcName = new DataColumn( "Name", Type.GetType("System.String")); table.Columns.Add(dcName); return table; } } }