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
DataTableder vil blive brugt til opdateringen. - Sletter rækken med
Code = 1101(for eksempel) direkte fra databasen, dvs. du bruger ikkeDataTableher. Dette emulerer en anden bruger, der sletter rækken medCode = 1101fra en anden applikation. Eller en anden del af din kode, der sletter rækken medCode = 1101. - Vælger rækken ud med
Code = 1101fraDataTable, dette er blot for at vise, at det stadig er der, selvom du har slettet det fra selve databasen. - Redigerer
Quantitykolonne i rækken medCode = 1101iDataTable. 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 .