不同版本操作系统和数据库的之间链接,和操作


本文以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
原文地址:https://www.cnblogs.com/haitaofeiyang/p/2013474.html