本文以DataTable.Rows[index].Delete()和DataTable.RemoveAt(index)讲解AcceptChanges()和RejectChanges()的区别。
1. DataTable.Rows[index].Delete()
该操作把指定行的状态(RowState)标记为Deleted,并未真正从DataTable中删除,此时DataTable的行数未变,引用该行将引发异常。
接下来的AcceptChanges()可以将其从DataTable中删除,RejectChanges()回滚到以前的状态以撤销删除。
所以在Delete()后执行Update()可以把更改提交到数据库,而在AcceptChanges()或RejectChanges()后执行Update()则不会更新数据库。
2. DataTable.RemoveAt(index)
该操作把指定行从DataTable的Rows集合中直接删除,这时DataTable中不存在该行,引用改行将引发异常。
AcceptChanges()和RejectChanges()对该操作无效。因为不存在该行,也就不会有该行的RowState,
因此通过RemoveAt()操作删除的行无法通过Update()把更改提交到数据库。
以下是对Delete()、RemoveAt()、AcceptChanges()和RejectChanges()进行的测试:
1 /* 2 * 对每行后注释格式的说明: 3 * DataTable.Rows.Count => 各行的状态(测试数据共6行,逗号分割) 4 * x: 标记为Deleted 5 * -: 不存在 6 */ 7 8 // 9 // 情形 1 10 // 11 this.adapter.Fill(this.dataSet.table1); // 6 => 1,2,3,4,5,6 12 this.dataSet.table1.Rows[0].Delete(); // 6 => x,2,3,4,5,6 13 this.dataSet.table1.RemoveAt(1); // 5 => x,-,3,4,5,6 14 this.dataSet.table1.RemoveAt(2); // 4 => x,-,3,-,5,6 15 this.dataSet.table1.RejectChanges(); // 4 => 1,-,3,-,5,6 16 // 17 // 情形 2 18 // 19 this.adapter.Fill(this.dataSet.table1); // 6 => 1,2,3,4,5,6 20 this.dataSet.table1.Rows[0].Delete(); // 6 => x,2,3,4,5,6 21 this.dataSet.table1.AcceptChanges(); // 5 => -,2,3,4,5,6 22 this.dataSet.table1.RemoveAt(1); // 4 => -,2,-,4,5,6 23 this.dataSet.table1.RemoveAt(2); // 3 => -,2,-,4,-,6 24 this.dataSet.table1.RejectChanges(); // 3 => -,2,-,4,-,6 25 // 26 // 情形 3 27 // 28 this.adapter.Fill(this.dataSet.table1); // 6 => 1,2,3,4,5,6 29 this.dataSet.table1.Rows[0].Delete(); // 6 => x,2,3,4,5,6 30 this.dataSet.table1.RemoveAt(1); // 5 => x,-,3,4,5,6 31 this.dataSet.table1.AcceptChanges(); // 4 => -,-,3,4,5,6 32 this.dataSet.table1.RemoveAt(2); // 3 => -,-,3,4,-,6 33 this.dataSet.table1.RejectChanges(); // 3 => -,-,3,4,-,6 34 // 35 // 情形 4 36 // 37 this.adapter.Fill(this.dataSet.table1); // 6 => 1,2,3,4,5,6 38 this.dataSet.table1.Rows[0].Delete(); // 6 => x,2,3,4,5,6 39 this.dataSet.table1.RemoveAt(1); // 5 => x,-,3,4,5,6 40 this.dataSet.table1.RemoveAt(2); // 4 => x,-,3,-,5,6 41 this.dataSet.table1.AcceptChanges(); // 3 => -,-,3,-,5,6 42 this.dataSet.table1.RejectChanges(); // 3 => -,-,3,-,5,6