row = table.NewRow()                 Detached   current=-      original=-      proposed=8000
table.Rows.Add(row)                  Added      current=8000   original=-      proposed=-
AcceptChanges()                      Unchanged  current=8000   original=8000   proposed=-
BeginEdit(); price = 8500            Unchanged  current=8000   original=8000   proposed=8500
EndEdit()                            Modified   current=8500   original=8000   proposed=-
RejectChanges()                      Unchanged  current=8000   original=8000   proposed=-
price = 9000; AcceptChanges()        Unchanged  current=9000   original=9000   proposed=-
row.Delete()                         Deleted    current=-      original=9000   proposed=-
RejectChanges()                      Unchanged  current=9000   original=9000   proposed=-
row.Delete(); AcceptChanges()        Detached   (gone: the table has 0 rows)

What GetChanges() would send to the database:
  Modified  S0002
  Deleted   S0003
  Added     S0004

Constraints the DataSet enforces by itself:
  ConstraintException: Column 'id' is constrained to be unique.  Value 'S0002' is already present.
  InvalidConstraintException: ForeignKeyConstraint Service_Bill requires the child key values (S0099) to exist in the parent table.

Row errors: HasErrors and RejectChanges
  ds.HasErrors = True; S0002.RowError = "A price must be positive."
  after RejectChanges: S0002 price = 12500, HasErrors = True
  after ClearErrors:   HasErrors = False
