Questo perché DataAdapter
utilizza Optimistic Concurrency
per impostazione predefinita. Ciò significa che se stai tentando di aggiornare una riga che non esiste più nel database o modificata, l'aggiornamento da DataAdapter
fallirà con l'eccezione di cui sopra.
Possibili scenari :
- Tra la selezione dei dati nel client e l'invio dell'aggiornamento, un altro utente sta eliminando o aggiornando questa riga dalla sua applicazione.
- Può darsi che tu stia eliminando i dati da qualche altra parte nella tua applicazione.
Ad esempio :
- Compila la
DataTable
che verrà utilizzato per l'aggiornamento. - Elimina la riga con
Code = 1101
(ad esempio) direttamente dal database, ovvero non si utilizza ilDataTable
qui. Questo sta emulando un altro utente che elimina la riga conCode = 1101
da un'altra applicazione. O qualche altra parte nel tuo codice eliminando la riga conCode = 1101
. - Seleziona la riga con
Code = 1101
dallaDataTable
, questo è solo per mostrare che è ancora lì anche se l'hai eliminato dal database stesso. - Modifica la
Quantity
colonna nella riga conCode = 1101
nellaDataTable
. Questo deve essere fatto, altrimenti la chiamata a Update ignorerà questa riga durante l'aggiornamento. - Esegue l'aggiornamento, questo genererà l'eccezione poiché stai tentando di aggiornare una riga che (non più) esiste nel database.
Se vuoi implementare Last Writer Wins
, Aggiungi il seguente codice:
cb.ConflictOption = ConflictOption.OverwriteChanges;
Inoltre c'è un'altra cosa possibile:se hai Decimal
/numeric
come colonne nel DB possono causare questo errore anche se i dati sembrano gli stessi. Ciò è dovuto a un errore di arrotondamento decimale.
Una nota importante :Dovresti sempre usare parameterized queries
a proposito. Questo tipo di concatenazioni di stringhe sono aperte per SQL Injection
.