Hoofdstuk 25: DCT – gegevens wijzigen

25.1          Inleiding gegevens wijzigen
25.2          RowState
25.3          AcceptChanges/RejectChanges
25.4          Concurrency conflicts
Oefeningen hoofdstuk 25

25.1         Inleiding gegevens wijzigen

Bij disconnected toegang worden steeds de volgende twee stappen doorlopen bij het wijzigen van gegevens:

  • Stap 1: de wijzigingen aanbrengen in het DataSet-object;
  • Stap 2: de wijzigingen doorvoeren in de database met de methode UpdateAll van de TableAdapterManager.

25.2         RowState

Een TableAdapter heeft 4 command-objecten: SelectCommand, InsertCommand, DeleteCommand en UpdateCommand. Met het SQL-statement in het SelectCommand kan een DataSet gevuld worden (methode Fill). Met de overige Command-objecten worden de gegevens van de database gewijzigd.

De eigenschap RowState van een DataRow geeft aan welke rijen aangepast zijn en hoe. Een DataRow kent verschillende RowStates, namelijk:

  • Unchanged: de rij is onveranderd;
  • Added: de rij is toegevoegd;
  • Modified: de rij is gewijzigd;
  • Deleted: de rij is verwijderd. (De rij verdwijnt niet echt maar krijgt de eigenschap RowState krijgt de waarde Deleted.)

Een DataRow wordt in verschillende versies bewaard in het interne geheugen:

  • Current: de huidige waarde;
  • Default: als de RowState Added of Modified is, dan is Default gelijk aan Current. Als RowState Deleted is, dan bestaat Default niet.
  • Original: de waarde die origineel in de DataRow geladen werd;
  • Proposed: de waarde wanneer de DataRow bewerkt wordt.

Met de eigenschap Item van DataRow kan de waarde in de kolom van een bepaalde versie opgevraagd worden.

Bijvoorbeeld: strProductnaam = dtrRij.Item(“Productnaam”, DataRowVersion.Original);

Top

25.3         AcceptChanges / RejectChanges

Om de aanpassingen in de DataTable te beheren worden de methoden AcceptChanges en RejectChanges gebruikt.

Via de methode AcceptChanges worden de wijzigingen definitief gemaakt in de DataSet zelf en de eigenschap RowState van de betrokken records in de DataTables wordt teruggezet op Unchanged (DataRowVersion = Current). Bij de methode UpdateAll van de TableAdapterManager of Update van de corresponderende DataTableAdapter wordt de methode AcceptChanges automatisch uitgevoerd.

Met de methode RejectChanges kunnen wijzigingen geannuleerd worden. De RowState van de betrokken records wordt ook hier teruggezet op Unchanged maar de wijzigingen worden niet doorgevoerd (DataRowVersion = Original).
Top

25.4         Concurrency conflicts

Concurrency conflicts ontstaan wanneer meerdere gebruikers proberen tegelijkertijd toegang te krijgen tot dezelfde database om gegevens te wijzigen.

Concurrency conflicts kunnen vermeden worden door records te vergrendelen zodat deze niet aangepast kunnen worden door een andere gebruiker. Er bestaan twee strategieën van vergrendeling:

  • Pessimistic locking: gedurende de hele duur van de wijziging worden de records vergrendeld, waardoor de records lange tijd ontoegankelijk kunnen zijn voor wijzigingen;
  • Optimistic locking: enkel bij het updaten worden de records vergrendeld.

Bij disconnected toegang is enkel Optimistic locking mogelijk. Daarom wordt bij het updaten gecontroleerd of de te wijzigen records ondertussen niet gewijzigd zijn in de database. Bij het updaten van een record in de database, die ondertussen gewijzigd is door een andere gebruiker, vindt er een exception plaats.

De uitvoering stopt in de ontwikkelingsfase met volgend Exception venster.

Figuur 25.1: Concurrency Exception

Figuur 25.1: Concurrency Exception

Top

Oefeningen hoofdstuk 25

Oefening 25-1     De gegevens van de producten kunnen aangepast worden in een formulier en producten kunnen verwijderd worden. Na het overbrengen van de aangepaste gegevens naar de database, verschijnt het aantal aangepaste producten per aanpassingstype.

Oefening 25-2     Uitbreiding op oefening 25-1: Aanpassingen aan de huidige record en aan alle records sinds de laatste bewaaractie moeten geannuleerd kunnen worden.

Oefening 25-3     De klantengegevens worden aangepast in een formulier. De gebruiker wordt op de hoogte gebracht bij concurrency conflicten.

Oefening 25-4     Maak een formulier frmVerwijderKlanten waarop de gegevens van de klanten staan. De gebruiker kan via dit formulier de gegevens van klanten verwijderen. Vooraleer de gegevens definitief verwijderd worden, worden de gegevens van de verwijderde rijen eergegeven in een DataGridView. De gebruiker kan de gegevens definitief verwijderen door op de button te drukken. Als de gebruiker in de toolstrip gegevens van klanten verwijderd wordt de button Preview zichtbaar. Deze button Preview wordt uitgeschakeld als een preview opgevraagd wordt.
Top
OPLOSSINGEN

Vorige          Volgende