See The LoadDataRow and Delete Methods of DataTable for intention.
Purpose
The following 3 tests [ Test 1 | Test 2 | Test 3 ] tell you about in which situation you can roll back your data and when you cannot.
This page is generated by the application developed in C# under Visual 2008 Profession SP + .NET 3.5 SP1 on Windows XP Professional SP3.
Test 1: No AcceptChanges before deletion
- Set up a DataTable with 2 rows; so the initial RowState of all DataRows is Added.
- Without AcceptChanges, immediately delete the 2nd DataRow using Delete method.
- The RowState of the deleted row is not Deleted but Detached; The result is different from what it is said in the documentation [According to MSDN, it is currently supported in: 4, 3.5, 3.0, 2.0, 1.1, 1.0]. Please also see the test foot notes in blue.
- Then RejectChanges after deletion; unfortunately, the System.Data.RowNotInTableException is received.
EmpId | FirstName | LastName | Salary | LastName and FirstName | RowState |
---|---|---|---|---|---|
A123456789 | Bettye | Williams | 11.00 | Williams, Bettye | Added |
B223456789 | Rex | Bloomer | 12.00 | Bloomer, Rex | Added |
Initial state: [B223456789, Rex] RowState: Added
Version: Original doesn't not exist.
Version: Current Value: Rex
Version: Proposed doesn't not exist.
Version: Default Value: Rex
Using Delete method to delete [B223456789, Rex] at RowState: Added...
EmpId | FirstName | LastName | Salary | LastName and FirstName | RowState |
---|---|---|---|---|---|
A123456789 | Bettye | Williams | 11.00 | Williams, Bettye | Added |
The deleted row after deletion: RowState: Detached
Version: Original doesn't not exist.
Version: Current doesn't not exist.
Version: Proposed doesn't not exist.
Version: Default doesn't not exist.
This row has been removed from a table and does not have any data. BeginEdit() will allow creation of new data in this row.
System.Data.RowNotInTableException
at System.Data.DataRow.GetDefaultRecord() at System.Data.DataColumn.CheckNullable(DataRow row) at System.Data.DataColumn.CheckColumnConstraint(DataRow row, DataRowAction action) at System.Data.DataTable.RaiseRowChanging(DataRowChangeEventArgs args, DataRow eRow, DataRowAction eAction, Boolean fireEvent) at System.Data.DataTable.SetNewRecordWorker(DataRow row, Int32 proposedRecord, DataRowAction action, Boolean isInMerge, Int32 position, Boolean fireEvent, Exception& deferredException) at System.Data.DataTable.SetNewRecord(DataRow row, Int32 proposedRecord, DataRowAction action, Boolean isInMerge, Boolean fireEvent) at System.Data.DataTable.RollbackRow(DataRow row) at System.Data.DataRow.RejectChanges() ...
After error: RowState: Detached
Version: Original doesn't not exist.
Version: Current doesn't not exist.
Version: Proposed doesn't not exist.
Version: Default doesn't not exist.
Test 2: AcceptChanges before deletion- Set up a DataTable with 2 rows; so the initial RowState of all DataRows is Added.
- Then AcceptChanges, which changes the RowState from Added to Unchanged.
- Delete the 2nd DataRow using Delete method. The RowState of the 2nd DataRow is marked as Deleted now.
- Immdiately RejectChanges after deletion, which changes the RowState from Deleted back to Unchanged
EmpId | FirstName | LastName | Salary | LastName and FirstName | RowState |
---|---|---|---|---|---|
A123456789 | Bettye | Williams | 11.00 | Williams, Bettye | Added |
B223456789 | Rex | Bloomer | 12.00 | Bloomer, Rex | Added |
Initial state: [B223456789, Rex] RowState: Added
Version: Original doesn't not exist.
Version: Current Value: Rex
Version: Proposed doesn't not exist.
Version: Default Value: Rex
AcceptChanges. [B223456789, Rex] RowState: Unchanged
Version: Original Value: Rex
Version: Current Value: Rex
Version: Proposed doesn't not exist.
Version: Default Value: Rex
Using Delete method to delete [B223456789, Rex] at RowState: Unchanged...
EmpId | FirstName | LastName | Salary | LastName and FirstName | RowState |
---|---|---|---|---|---|
A123456789 | Bettye | Williams | 11.00 | Williams, Bettye | Unchanged |
? | ? | ? | ? | ? | Deleted |
The deleted row after deletion: RowState: Deleted
Version: Original Value: Rex
Version: Current doesn't not exist.
Version: Proposed doesn't not exist.
Version: Default doesn't not exist.
RejectChanges:
EmpId | FirstName | LastName | Salary | LastName and FirstName | RowState |
---|---|---|---|---|---|
A123456789 | Bettye | Williams | 11.00 | Williams, Bettye | Unchanged |
B223456789 | Rex | Bloomer | 12.00 | Bloomer, Rex | Unchanged |
[B223456789, Rex] RowState: Unchanged
Version: Original Value: Rex
Version: Current Value: Rex
Version: Proposed doesn't not exist.
Version: Default Value: Rex
Test 3: AcceptChanges, modification and then deletion- Set up a DataTable with 2 rows; so the initial RowState of all DataRows is Added.
- Then AcceptChanges, which changes the RowState from Added to Unchanged.
- Start BeginEdit ... EndEdit block to modify the 2nd row. Change the FirstName from Rex to Susan.
- The expression column LastName and FirstName remains unchanged until the EndEdit method is called while FirstName is modified before calling EndEdit.
- Then delete the 2nd DataRow using Delete method. The RowState of the 2nd DataRow is marked as Deleted now.
- Immdiately RejectChanges after deletion, which changes everything back to the state when the AcceptChanges is last called; thus the RowState is rolled back all the way from Deleted to Unchanged
EmpId | FirstName | LastName | Salary | LastName and FirstName | RowState |
---|---|---|---|---|---|
A123456789 | Bettye | Williams | 11.00 | Williams, Bettye | Added |
B223456789 | Rex | Bloomer | 12.00 | Bloomer, Rex | Added |
Initial state: [B223456789, Rex] RowState: Added
Version: Original doesn't not exist.
Version: Current Value: Rex
Version: Proposed doesn't not exist.
Version: Default Value: Rex
AcceptChanges. [B223456789, Rex] RowState: Unchanged
Version: Original Value: Rex
Version: Current Value: Rex
Version: Proposed doesn't not exist.
Version: Default Value: Rex
BeginEdit and modified the 2nd row:
row.BeginEdit(); row["FirstName"] = "Susan";
EmpId | FirstName | LastName | Salary | LastName and FirstName | RowState |
---|---|---|---|---|---|
A123456789 | Bettye | Williams | 11.00 | Williams, Bettye | Unchanged |
B223456789 | Susan | Bloomer | 12.00 | Bloomer, Rex | Unchanged |
Version: Original Value: Rex
Version: Current Value: Rex
Version: Proposed Value: Susan
Version: Default Value: Susan
After EndEdit:
row.EndEdit();
EmpId | FirstName | LastName | Salary | LastName and FirstName | RowState |
---|---|---|---|---|---|
A123456789 | Bettye | Williams | 11.00 | Williams, Bettye | Unchanged |
B223456789 | Susan | Bloomer | 12.00 | Bloomer, Susan | Modified |
Version: Original Value: Rex
Version: Current Value: Susan
Version: Proposed doesn't not exist.
Version: Default Value: Susan
Using Delete method to delete [B223456789, Susan] at RowState: Modified...
EmpId | FirstName | LastName | Salary | LastName and FirstName | RowState |
---|---|---|---|---|---|
A123456789 | Bettye | Williams | 11.00 | Williams, Bettye | Unchanged |
? | ? | ? | ? | ? | Deleted |
The deleted row after deletion: RowState: Deleted
Version: Original Value: Rex
Version: Current doesn't not exist.
Version: Proposed doesn't not exist.
Version: Default doesn't not exist.
RejectChanges:
EmpId | FirstName | LastName | Salary | LastName and FirstName | RowState |
---|---|---|---|---|---|
A123456789 | Bettye | Williams | 11.00 | Williams, Bettye | Unchanged |
B223456789 | Rex | Bloomer | 12.00 | Bloomer, Rex | Unchanged |
[B223456789, Rex] RowState: Unchanged
Version: Original Value: Rex
Version: Current Value: Rex
Version: Proposed doesn't not exist.
Version: Default Value: Rex