Dit komt omdat DataAdapter
gebruikt Optimistic Concurrency
standaard. Dit betekent dat als u een rij probeert bij te werken die niet meer in de database bestaat of is gewijzigd, de update van de DataAdapter
zal mislukken met de uitzondering hierboven.
Mogelijke scenario's :
- Tussen het selecteren van de gegevens in de client en het verzenden van de update, verwijdert of updatet een andere gebruiker deze rij uit zijn applicatie.
- Het kan zijn dat u de gegevens ergens anders in uw toepassing verwijdert.
Bijvoorbeeld :
- U vult de
DataTable
dat zal worden gebruikt voor de update. - Verwijdert de rij met
Code = 1101
(bijvoorbeeld) rechtstreeks uit de database, d.w.z. u gebruikt deDataTable
niet hier. Dit emuleert een andere gebruiker die de rij verwijdert metCode = 1101
van een andere applicatie. Of een ander deel van uw code dat de rij verwijdert metCode = 1101
. - Selecteert de rij met
Code = 1101
uit deDataTable
, dit is alleen om te laten zien dat het er nog steeds is, ook al heb je het uit de database zelf verwijderd. - Bewerkt de
Quantity
kolom in de rij metCode = 1101
in deDataTable
. Dit moet worden gedaan, anders negeert de oproep tot Update deze rij bij het updaten. - Voert de update uit, hierdoor wordt de uitzondering gegenereerd omdat u een rij probeert bij te werken die (niet meer) in de database bestaat.
Als u Last Writer Wins
. wilt implementeren , Voeg de volgende code toe:
cb.ConflictOption = ConflictOption.OverwriteChanges;
Er is ook nog iets mogelijk:als je Decimal
. hebt /numeric
als kolommen in de DB kunnen ze deze fout veroorzaken, ook al zien de gegevens er hetzelfde uit. Dit komt door een fout bij het afronden van decimalen.
Een belangrijke opmerking :Gebruik altijd parameterized queries
trouwens. Dit soort aaneenschakeling van tekenreeksen staat open voor SQL Injection
.