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
DataTablesom kommer att användas för uppdateringen. - Tar bort raden med
Code = 1101(till exempel) direkt från databasen, dvs du använder inteDataTablehär. Detta emulerar en annan användare som tar bort raden medCode = 1101från en annan applikation. Eller någon annan del av din kod som tar bort raden medCode = 1101. - Väljer ut raden med
Code = 1101frå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
Quantitykolumn i raden medCode = 1101iDataTable. 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 .