Dette er fordi DataAdapter
bruger Optimistic Concurrency
som standard. Det betyder, at hvis du forsøger at opdatere en række, der ikke længere eksisterer i databasen eller ændret, vil opdateringen fra DataAdapter
vil mislykkes med undtagelsen ovenfor.
Mulige scenarier :
- Mellem du vælger data til klienten og sender opdateringen, sletter eller opdaterer en anden bruger denne række fra sin applikation.
- Det kan være, at du sletter dataene fra et andet sted i din applikation.
For eksempel :
- Du udfylder
DataTable
der vil blive brugt til opdateringen. - Sletter rækken med
Code = 1101
(for eksempel) direkte fra databasen, dvs. du bruger ikkeDataTable
her. Dette emulerer en anden bruger, der sletter rækken medCode = 1101
fra en anden applikation. Eller en anden del af din kode, der sletter rækken medCode = 1101
. - Vælger rækken ud med
Code = 1101
fraDataTable
, dette er blot for at vise, at det stadig er der, selvom du har slettet det fra selve databasen. - Redigerer
Quantity
kolonne i rækken medCode = 1101
iDataTable
. Dette skal gøres, ellers vil opkaldet til opdatering ignorere denne række ved opdatering. - Udfører opdateringen, dette vil kaste undtagelsen, da du forsøger at opdatere en række, der (ikke længere) eksisterer i databasen.
Hvis du vil implementere Last Writer Wins
, Tilføj følgende kode:
cb.ConflictOption = ConflictOption.OverwriteChanges;
Der er også en mulig ting mere:hvis du har Decimal
/numeric
som kolonner i DB kan de forårsage denne fejl, selvom dataene ser ens ud. Dette skyldes en decimalafrundingsfejl.
En vigtig bemærkning :Du bør altid bruge parameterized queries
i øvrigt. Denne slags strengsammenkædninger er åbne for SQL Injection
.