Detta beror på att DataAdapter
använder Optimistic Concurrency
som standard. Detta innebär att om du försöker uppdatera en rad som inte längre finns i databasen eller ändras, uppdateringen från DataAdapter
kommer att misslyckas med undantaget ovan.
Möjliga scenarier :
- Mellan det att du väljer data till klienten och skickar uppdateringen, tar en annan användare bort eller uppdaterar den här raden från sin applikation.
- Det kan vara så att du tar bort data från någon annanstans i din applikation.
Till exempel :
- Du fyller i
DataTable
som kommer att användas för uppdateringen. - Tar bort raden med
Code = 1101
(till exempel) direkt från databasen, dvs du använder inteDataTable
här. Detta emulerar en annan användare som tar bort raden medCode = 1101
från en annan applikation. Eller någon annan del av din kod som tar bort raden medCode = 1101
. - Väljer ut raden med
Code = 1101
frånDataTable
, detta är bara för att visa att det fortfarande finns kvar även om du har tagit bort det från själva databasen. - Redigerar
Quantity
kolumn i raden medCode = 1101
iDataTable
. Detta måste göras, annars kommer anropet till uppdatering att ignorera den här raden vid uppdatering. - Kör uppdateringen, detta kommer att skapa undantaget eftersom du försöker uppdatera en rad som (inte längre) finns i databasen.
Om du vill implementera Last Writer Wins
, Lägg till följande kod:
cb.ConflictOption = ConflictOption.OverwriteChanges;
Det finns också en annan möjlig sak:om du har Decimal
/numeric
som kolumner i databasen kan de orsaka detta fel även om data ser likadana ut. Detta beror på ett decimalavrundningsfel.
En viktig anmärkning :Du bör alltid använda parameterized queries
förresten. Den här typen av strängsammansättningar är öppna för SQL Injection
.